6

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

我习惯于使用 NUnit/XUnit 来满足我的大部分测试需求,使用 NSubstitute 之类的东西来进行模拟。据我所知,您不能将这些框架用于 Windows Phone 项目......

经过一些调查,我想知道以下情况是否可行:

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

通过使用可移植类库,我希望单元测试尽可能接近在设备上运行,而无需打开模拟器。

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

我希望衡量人们对这是明智之举还是愚蠢的差事的看法...

谢谢,
基龙

[1] 我知道那里有解决方案,但似乎没有一个像完整的框架测试那样集成——我专门谈论的是 VS2012/Resharper 支持在不需要模拟器的情况下运行单元测试。

[2] 有谁知道您是否可以使用 WP8 SDK 以 Windows Phone 7.x 为目标?

4

4 回答 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

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

2)第二步是创建一个Visual Studio Unit Test Project,一个普通的,而不是Windows Store Unit Test Project

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

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

  • 系统.Windows
  • 微软电话

它们可以在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 代码覆盖率功能集成。

注意: Windows Phone 部门正式支持单元测试,这是我和我在 Skype 部门的团队发现的一种解决方法。

奖励答案:

有谁知道您是否可以使用 WP8 SDK 以 Windows Phone 7.x 为目标?

在此处输入图像描述

于 2012-10-23T16:34:18.337 回答
2

我做了一些相当基本的测试,发现一个可移植库类项目和一个用于测试的普通类库运行良好。

对此需要注意的是,我还没有找到为可移植类库构建的 MVVM 框架,这使得 View Model 无法测试......除非......您使用文件链接(并假设 View Models 继承自 MVVM 框架特定的基础班级)。P 虽然它并不理想,但这是我发现的最好的前进方式。


编辑:

似乎有一个基于便携式类库的 Prism ( v4.5 ) 版本......

至少在撰写本文时,它不是稳定版或预发布版的 NuGet,但我将对它的使用和更新进行一些调查。

我还听说 Windows Phone 8 SDK 将能够以 Windows Phone 7 为目标。

于 2012-10-22T07:36:40.370 回答
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

于 2013-02-12T07:35:29.327 回答
1

我设法使用 Moq 对我在 VS2013 WP8.0 应用程序中使用的视图模型进行了单元测试。这是我的解决方案结构: - 带有自制 Prism 库的 WP8 (Silverlight) - WP8 便携式库作为我的表示层 - WP8 单元测试项目

这里下载最新的起订量版本。在 Silverlight 文件夹中,您会找到 2 个 dll,一个用于 Moq,一个用于 Castle Core。在您的单元测试项目中使用它们作为参考。请注意,VS2013 不允许您直接添加这些 DLL 作为参考。因此,卸载您的项目,编辑 .csproj,手动添加 2 个引用并重新加载您的项目

不是一种非常干净的方法,但这是我发现对我的视图模型进行单元测试的唯一方法。

于 2014-09-23T06:37:50.073 回答