返回首页

第二十浏览器{A}{A2的}{A3的}{A4纸}{A5的}{A6的}{A7的}catel - 第8的n:WP7的芒果和单位测试相机目录{A8的} 演示应用程序{A9的}{A10的}
第一部分 - Windows Phone 7上的单元测试{A11}{A12}{A13号}{A14高速公路} {A15}{A16}{A17中}
第二部分 - 相机服务{A18}{A19中}{A20的}{A21号}{A22号}{A23}{A24的}{A25}{A26}{A27高速公路} 1。介绍
欢迎的文章第7部分一系列有关Catel。如果你没有看过以前的文章(S)的Catel它建议您这样做。他们发现他们不应该被编号太辛苦了。
您可能会想:为什么这家伙实施1 CameraService?有一个美丽的API可用使用PhotoCamera类。再次提醒自己,为什么你想要写您在MVVM的应用?是它,因为它是本世纪的嗡嗡声字,或???噢,现在我还记得,你想成为能够单元测试你的所有视图模型。现在告诉我,怎么可能,如果你实例化一个PhotoCamera对象呢?和,例如,如何你要支持所有不同种类的有摄像头(支持所有闪光模式,有的不支持所有闪光模式等)。
本文将解释如何在CameraService创建和更重要的,为什么它被创建。在CameraService让你真正在MVVM方式进行交互的Windows手机上的摄像头7芒果设备。本文使用Catel,但服务可以使用其自己如果你想。
这篇文章被分裂成几个部分。第一部分是有关单位一般为Windows Phone 7测试。 "第二部分是有关单位测试相机服务。最后,最后一部分是有关结论等。{A28} 2。演示应用程序{A29} 2.1。功能要求
{S0的}
在这篇文章中使用的演示应用程序是非常简单的。 "第一个屏幕,允许他人使用相机拍照。如果有现有的应用程序的图片,用户还可以"甩尾??的权利浏览图片。
在图片上,它有可能轻弹,到下一个(右)或以前的图像(左)。当第一张图像显示用户左拐,主页应该成为可见。这也应该是可以删除图像。当图像被删除,它应该始终选择在被删除的图像的索引左侧的图像。如果所选形象是第一位的有静止图像左,未来的第一形象 被显示出来。如果有删除后一个项目,应用程序没有留下影像应导航到主页。
{S}{A30的} 2.2。单元测试的要求
大,已知的功能要求。现在,让我们看看如何单元测试这个应用程序。以下功能应该单元测试。所有的测试都屈指可数,使他们能够很容易被引用。空间首页[MP_01]手指右,不应该是可能的,如果没有图像[MP_02]用手指向右应该是可能的,如果有图像可用的[MP_03]手指右拍照时,不应该是可能的[MP_04]单击视图按钮时,应该不能有没有图像[MP_05]单击"视图"按钮时,应该能够没有图像在任何时候都应该尽可能[MP_06]航行约查看[MP_07]拍摄照片,应该是可能的 [MP_08]拍摄照片已经拍摄照片时,不应该可能PhotoView中[PV_01]用手指向右不应该是可能的,如果没有图像在正确的[PV_02]手指在中间的形象权应加载下一张图片[PV_03]用手指在中间的形象应该载入到左上一张图片[PV_04]在第一幅图像用手指左侧导航主页[PV_05]取消删除图像命令,不应该离开 [PV_06]删除图像导航到以前的形象[PV_07]删除第一张图片,图像离开时导航到下一张图片[PV_08]删除第一张图片,图像离开时没有导航主页[PV_09]点击相机按钮应始终导航到主页
示例代码本文附带包含单位以上所有情况的测试。 Windows Phone 7的第I部分单元测试{A31号} 3。建立单元测试
如果你已经知道如何建立一个单元测试Windows Phone 7应用,你可以跳过这一章。
设置为Windows Phone 7单元测试是不容易你所期望的。有没有单元测试框架开箱,也不有模板,允许你创建一个单元测试项目。有些人正试图智取运行常规的Silverlight单元测试系统。我认为这是一个非常糟糕的主意,因为那时你不会对测试逻辑WP7框架,但对Silverlight框架,这是不同的。{第A32} 3.1。下载正确的库
首先,有必要使专业图书馆WP7的单元测试。我使用的是Windows Phone 7的工具包,但也坐落在示范项目的lib文件夹,附带这篇文章。 "需要以下两个库:Microsoft.Silverlight.Testing.dllMicrosoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll{第A33} 3.2。创建单元测试项目
现在,我们有所需的库,让我们去创造单元测试项目。第一步是创建一个新的Windows Phone 7应用程序:
{S}
由于我们使用的是芒果,确保选择Windows电话7.1。经过这一步,确保添加引用到这两个原始的Windows Phone 7应用程序和您先前下载的测试库在这一章。 Visual Studio可能警告你,这可能是不安全的参考Silverlight的组件,但你可以忽略这一点。{A34高速公路} 3.3。修改的空间首页
最后要做的是修改MainPage.xaml.cs中这是自动的项目模板。确保构造MainPage的看起来像下面的代码:

public MainPage()

{

    InitializeComponent();

 

    Content = UnitTestSystem.CreateTestPage();

}

您现在已经准备好创建你的第一个单元测试!让我们做,以确保能够运行单元测试。添加一个新类称为DemoTest并使用下列内容:
最后,如果你运行单元测试项目,你会看到下面的屏幕(这应该是熟悉的,如果你是用来书写单位在Silverlight的测试):
{中三} {四至}{A35号} 4。无嘲讽的单元测试
在WPF和Silverlight的单元测试,你可能使用嘲笑所有的接口。在Catel,我们始终提供一个测试的实施每一项服务,让你不会被强迫在任何时候都嘲笑的服务。的当然,它仍然是嘲笑为WPF和Silverlight的服务,但对于Windows Phone 7的是别样的故事。
目前没有对WP7的mocking框架有可能永远不会成为嘲讽的框架。你可能在想什么?不为什么,有一个很大的市场,在那里,我希望能够使用我的WP7的应用单元测试。不幸的是,Reflection.Emit的方法在WP7的丢失。这种方法是必要的嘲笑任何物体。{A36} 4.1。测试活动
的第一个问题,想出了写这个代码的文章是的GestureListener,有代码内声明。如果你未知的GestureListener的,它是一个类,允许你认购WP7的页面上的特定手势。所以,我上创建一个命令查看模型轻弹的手势检测时,应执行。这是我保持MVVM模式不变:
var gestureListener = GestureService.GetGestureListener(this);

gestureListener.Flick += (sender, e) =>

{

    if (ViewModel != null)

    {

        ViewModel.Flick.Execute(e);

    }

};

正如你可以看到,弗里克尽快执行命令轻弹的手势检测。
了接下来的问题是需要进行单元测试是否弹左或右,构造的FlickGestureEventArgs是内部。该工具包的开发团队决定把它为什么内部仍是未知给我,但我必须找到解决的办法。
我想出了这个想法是很容易的。在应用方面,我创建了一个新的完全一样的相同属性的对象FlickDataFlickGestureEventArgs。然后,我创建了几个构造函数,允许也可以简单的单元测试和内部使用真正的应用程序逻辑。下面是代码为FlickData类:{体C3}
这个类的旁边,它也需要更新订阅的命令(因为它现在不能接受一个参数类型FlickGestureEventArgs但参数的类型FlickData)。因为在FlickData类接受作为参数类型FlickGestureEventArgs的对象,代码变化是非常小的。这是更新后的代码:{的C4}
现在一切都到位视图模型进行测试,让我们来看看一个简单的单元测试[MP_01]测试如果弹不允许在主要页面,如果没有可用的图像:{C5的}
正如你可以看到,测试实施的IPhotoRepository注册,以确保没有图像视图模型。然后,单元测试,检查是否到左轻弹是不可能的(以轻弹主页上留下永远应该是可能的),以及是否向右侧甩尾不可能(向右侧甩尾,如果有任何图像,不应该是可能的)。{A37} 4.2。测试服务
当为Catel写服务,作为开发商,我们强烈相信在可测性(否则,什么是写整点应用程序使用MVVM?)的应用。因此,我们提供了一个测试实施的每一项服务,我们写的Catel MVVM工具包。一些人们发现这相当的开销,因为他们喜欢用嘲讽的框架。无论你使用的是与我们的罚款,我们只是想以两种方式支持
这条原则似乎走出来非常方便适用于Windows7因为有没有在WP7的mocking框架。因此,测试Catel提供的服务是非常,非常简单。在这个例子中,IMessageService将用于单元测试可以检查结果是否正确处理。
首先,让我们开始一个单元测试,使任何意义。在演示应用程序,它可以删除现有的图像。用户应要求确认一个单元测试,所以必须写检查,如果这确认正确实施。整个单元测试的代码看起来是这样的:{5233}
正如你可以看到,有几个正在服务在这个单元测试使用。其中之一,IPhoneRepository,创建里面的单元测试。其他的人似乎是领域。字段是初始化如下TestInitialize方法:{C7-}
而是真正MessageService,测试的执行MessageService的实例化和注册IoC容器。
回到我们的单元测试和集中显示部分如下:{C8的}
的INavigationService的的最后的导航信息清除,以便我们可以确保没有电话的INavigationService在我们的单元测试。我们也排队为IMessageService的预期结果。第一次调用的IMessageService返回指定MessageResult的。
的话,测试,检查是否取消是正确的处理。应用程序不应导航和图像应保持不变。第二部分 - 摄像机服务{A38} 5。相机服务的基础
CameraService提供一个真正的执行,但也是一个测试的实施。真正实现自动注册在IoC容器中,如果一个视图模型被实例化的第一次。如果您不喜欢使用ViewModelBase,船舶与Catel,你将有注册这样的相机服务:
serviceLocator.RegisterInstance<ICameraService>(CameraService);

的CameraService如下的PhotoCamera的空气污染指数尽可能。这样,有没有使用的学习曲线{A39} 5.1。启动和停止服务
PhotoCamera文件连续状态相机的对象,必须建立并妥善处置。在服务上,这是封装的通过的StartService StopService方法的。启动该服务,使用下面的代码:{C10的}
要停止服务,使用下面的代码:(注:关闭方法是功能的Catel):{C11的}{的A40} 5.2。捕获图像
要拍摄图像,必须做几件事情。第一行动来完成认购的ICameraService.CaptureImageAvailable事件。下一步是调用像显示CaptureImage方法 如下:{C12的}
最后一部分是非常重要的。你将需要阅读图像流从CaptureImageAvailable事件:
BitmapImage bitmap = new BitmapImage();

bitmap.SetSource(e.ImageStream);
{A41} 5.3。在视图中显示的摄像头的视频
要显示在手机上的摄像头输入的预览,首先订阅的ICameraService.CaptureThumbnailImageAvailable事件。未来第一步是创建一个视图模型的属性:
/// <summary>

/// Gets or sets the current photo.

/// </summary>

public BitmapImage CurrentPhoto

{

    get { return GetValue<BitmapImage>(CurrentPhotoProperty); }

    set { SetValue(CurrentPhotoProperty, value); }

}

 

/// <summary>

/// Register the CurrentPhoto property so it is known in the class.

/// </summary>

public static readonly PropertyData CurrentPhotoProperty = RegisterProperty("CurrentPhoto", typeof(BitmapImage));

此属性的定义是一个Catel的财产,但如果你喜欢用不同的MVVM框架或您自己的属性定义样式,你是自由的,以及做。
在视图中,使用Image控件显示当前照片:
<Image Grid.Row="0"

Source="{Binding

CurrentPhoto}" />

最后但并非最不重要的,我们需要更新CurrentPhoto财产时,是一个新的缩略图。{C16的}{A42} 5.4。实例化执行测试
的CameraService的的测试的实施需要图像被实例化。该服务将使用这个图像创建一个动画。将应用于动画图像滚动到正确的像素由像素。
要实例化的测试服务,添加图像到Windows电话7项目资源,并设置其生成操作。然后实例服务,如下面的代码:{C17的}
默认情况下,的CameraService将生成一个新缩略图每隔50毫秒。它是可以自定义一个构造函数重载。{A43号} 5.5。测试自定义相机设置
有时它需要测试不同的决议。一购买所有可用的Windows Phone 7设备和测试办法做到这一点是软件对所有的摄像机。一个简单的方法是使用ICameraService和自定义相机选项来测试应用程序如何响应不同的设置。
的设置存储在CameraServiceTestData类。这个类允许定制所有上PhotoCamera的通常发现的属性类。例如,只允许主相机(因为前置相机不是所有设备都支持),使用下面的代码:{C18的}
也可以更改缩略图和最后图像的分辨率为:{C19的}{A44} 6。在模拟器中使用的CameraService
首先,必须有某种方式决定是否在模拟器或者实际设备上运行的代码。在App.xaml.cs的应用,在国际奥委会注册的相机服务的测试版本容器:{C20的}
如果该服务视图模型正确实施{A45高速公路}解释,你会看到主页上更新缩略图:
{五} 在单元测试中使用的CameraService
到目前为止,我们只涉及Windows的基本单元测试电话7。现在让我们来看看如何测试相机是否执行在应用程序正常工作。
我们开始写TestInitialize方法实例测试实例:{C21的}
现在的看法正在单元测试的车型将使用测试的执行情况。{A47公路} 8。结论
本文为什么我们Catel开发商,有选择实施服务PhotoCamera类。我们希望您真正理解为什么我们创造了这个服务,它是多么强大。
一些开发商真的不想使用一些Catel因为其他人告诉他们使用的MVVM光(或原因(例如,另一个MVVM的框架))。在这种情况下,它仍然是可以使用所有的Catel提供的服务。刚刚注册的所有服务在你的IoC手动容器的选择。
我们很乐意听到您的反馈!
关于Catel的信息,可以发现在http://catel.codeplex.com|海尔特面包车Horrik

回答