Windows Phone开发和单元测试

Kie*_*ron 6 unit-testing windows-phone portable-class-library windows-phone-8

我正在寻找一个针对Windows Phone的项目,但由于缺乏单元测试支持,我有点迟钝[1].

我习惯使用NUnit/XUnit来满足我的大多数测试需求,比如NSubstitute用于模拟.我可以说,你不能将这些框架用于Windows Phone项目......

鉴于一些调查,我想知道以下方案是否有效:

  • 使用Visual Studio 2012
  • 为View Models和其他逻辑创建可移植类库项目
  • 为单元测试创​​建其他可移植类库项目
  • 等待Windows Phone 8 SDK [2],然后使用它创建视图.

通过使用可移植类库,我希望单元测试尽可能接近在设备上运行,而不必破解模拟器.

另一个优点是我可以看到这个解决方案在TFS构建环境中工作 - 所以运行测试是CI构建的一部分......

我希望能够衡量人们的意见,看看这是一个明智的举动,还是愚蠢的错误......

谢谢,
Kieron

[1]我知道有解决方案,但没有一个看起来像完整的框架测试那样集成 - 我正在谈论VS2012/Resharper中的支持,无需模拟器即可运行单元测试.

[2]有没有人知道您是否可以使用WP8 SDK定位Windows Phone 7.x?

Cla*_*sen 10

这就是我们的工作:

  • 将电话专用逻辑引入外墙
  • 尽可能注入依赖项
  • 避免使用任何需要在构建时在UI线程上运行的代码,这意味着任何UI控件,ImageSource,基本上任何不是枚举的System.Windows类型(例如Visibility)
  • 非常依赖ValueConverters将业务逻辑转换为UI逻辑.

如果你这样做,那么你可以使用内置的Visual Studio单元测试框架来测试Windows Phone项目(不仅仅是可移植类库),而且还有一些hackery.

1)第一步是禁用强名称验证,这可以通过以下Powershell脚本完成:

reg DELETE "HKLM\Software\Microsoft\StrongName\Verification" /f
reg ADD "HKLM\Software\Microsoft\StrongName\Verification\*,*" /f
if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64")
{
   reg DELETE "HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification" /f
   reg ADD "HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification\*,*" /f
}
Restart-Service msiserver
Run Code Online (Sandbox Code Playgroud)

请注意,它会在应用于此的计算机上创建一个安全漏洞!

2)第二步是创建一个Visual Studio单元测试项目,一个常规项目,而不是一个Windows Store单元测试项目.

3)第三步是将Windows Phone 8项目作为参考.这有效,你现在可以使用Microsoft Fakes来制作mscorlibSystem.dll,允许你DateTime在单元测试中伪造类型,这是一个非常方便的功能.

4)第四步是获取以下Windows Phone程序集的本地副本(以及您需要的任何其他程序集):

  • System.Windows
  • Microsoft.Phone

它们可以在C:\ Program Files(x86)\ Microsoft SDKs\Windows Phone\v8.0\Tools\MDILXAPCompile\Framework文件夹中找到.

将它们本地复制到/ lib /文件夹,然后卸载并编辑单元测试项目的MSBUILD xml.

更改:

<Reference Include="System.Windows" />
<Reference Include="Microsoft.Phone" />
Run Code Online (Sandbox Code Playgroud)

<Reference Include="System.Windows, Version=2.0.6.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, processorArchitecture=MSIL">
  <HintPath>lib\System.Windows.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Phone, Version=8.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e, processorArchitecture=MSIL">
  <HintPath>lib\Microsoft.Phone.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

另外,为避免编译时出现警告,请将以下元素添加到第一个元素中 <PropertyGroup>

<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
Run Code Online (Sandbox Code Playgroud)

重新加载,编译,运行测试.Voilà,你已经完成了.您甚至可以将其与Microsoft Code Coverage功能集成.

注意: Windows Phone部门没有正式支持单元测试,这是我的团队和我在Skype部门找到的解决方法.

奖金回答:

有谁知道你是否可以使用WP8 SDK定位Windows Phone 7.x?

在此输入图像描述


Ani*_*udh 2

更新:现在支持 Windows Phone 8 的单元测试。

http://blogs.msdn.com/b/visualstudioalm/archive/2013/01/31/windows-phone-unit-tests-in-visual-studio-2012-update-2.aspx

  • 小注意事项:它不支持混合应用程序,仍然需要模拟器才能运行,因此不支持模拟框架。我发现它对于实际测试来说相当无用。 (2认同)