Windows Phone开发和单元测试

6
我希望开始一个针对Windows Phone的项目,但是我对缺乏单元测试支持有些不放心[1]。
我习惯于使用NUnit/XUnit进行大部分测试需求,并使用NSubstitute进行模拟。据我所知,你无法在Windows Phone项目中使用这些框架...
经过一些调查,我想知道以下情况是否有效:
- 使用Visual Studio 2012 - 为视图模型和其他逻辑创建可移植类库项目 - 为单元测试创建其他可移植类库项目 - 等待Windows Phone 8 SDK[2],然后使用它创建视图。
通过使用可移植类库,我希望单元测试尽可能接近在设备上运行,而不必打开模拟器。
另一个好处是,我可以看到这个解决方案能够在TFS构建环境中工作——因此运行测试是CI构建的一部分...
我希望了解人们对这是否明智的意见,或者这是愚蠢的举动...
谢谢, Kieron
[1] 我知道有一些解决方案,但没有一个似乎像完整框架测试那样集成——我特指在VS2012/ Resharper中支持运行单元测试而无需模拟器的支持。
[2] 有人知道是否可以使用WP8 SDK针对Windows Phone 7.x吗?
4个回答

10
这是我们的做法:
  • 将特定于电话的逻辑抽象为门面
  • 在任何可能的地方注入依赖项
  • 尽量避免在构造时使用需要在 UI 线程上运行的任何代码,这意味着任何 UI 控件、ImageSource,基本上是任何 System.Windows 类型,除了枚举 (例如 Visibility)
  • 大量依赖 ValueConverters 将业务逻辑转换为 UI 逻辑。

如果这样做,你就可以使用内置的 Visual Studio 单元测试框架进行测试 Windows Phone 项目(不仅限于可移植类库),只需进行一些黑科技操作。

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

注意它会在应用于此机器时创建一个安全漏洞!
第二步是创建一个Visual Studio单元测试项目,一个常规项目,而不是Windows Store单元测试项目。
第三步是将Windows Phone 8项目作为引用包含。这样就可以使用Microsoft Fakes来使mscorlib和System.dll成为可伪造类型的源,例如DateTime,在您的单元测试中是非常方便的。
第四步是获取以下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" />

"到"
<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>

此外,为避免编译时出现警告,请在第一个<PropertyGroup>中添加以下元素。
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>

重新加载、编译、运行测试。完成了,你甚至可以将其与 Microsoft Code Coverage 功能集成。
注意:单位测试并非 Windows Phone 部门的官方支持,这是我和我的 Skype 团队发现的解决方法。 额外回答:

有人知道是否可以使用 WP8 SDK 以针对 Windows Phone 7.x 进行开发吗?

enter image description here


请给我反馈,告诉我这是否有用,这样我们就可以尝试将这个“问题”纳入下一个版本中。 - Claus Jørgensen

2

2
小提示:它不支持混合应用程序,仍然需要模拟器才能运行,因此不支持模拟框架。我发现它对于真正的测试而言相当不可用。 - Claus Jørgensen

2
我做了一些相当基本的测试,发现便携式库类项目和普通的类库对于这些测试都很好用。
但需要注意的是,我还没有找到一个专门为便携式类库构建的MVVM框架,这使得视图模型无法进行测试……除非使用文件链接(并假设视图模型继承自特定于MVVM框架的基础类)。
虽然不是理想的解决方案,但这是我找到的最佳方法。
编辑:看起来有一个基于便携式类库的 Prism(v4.5)发布了...
目前,至少在NuGet上还没有稳定版或预发布版,但我会对其使用进行调查并进行更新。
我也听说Windows Phone 8 SDK将能够针对Windows Phone 7。

1
以下是一些便携式MVVM框架:MvvmLight的便携分支MvvmCross。此外,我的Contoso Helpdesk示例将MVVM基础设施分离成可重用的库。 - Daniel Plaisted

1
我使用Moq成功地对我的VS2013 WP8.0应用程序中的视图模型进行了单元测试。以下是我的解决方案结构: - 使用自制Prism库的WP8(Silverlight) - WP8可移植库作为我的表示层 - WP8单元测试项目
点击此处下载最新的Moq版本。在Silverlight文件夹中,您将找到两个dll,一个用于Moq,另一个用于Castle Core。在您的单元测试项目中将它们用作参考。请注意,VS2013不允许您直接添加这些DLL作为引用。因此,请卸载您的项目,编辑.csproj文件,手动添加这2个引用,然后重新加载您的项目。
虽然不是很干净的方法,但这是我找到的唯一单元测试视图模型的方法。

这是正确的答案,在WP8.1 Silverlight上测试过。 - D.Rosado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接