Windows Phone 开发和单元测试

2023-11-26

我希望启动一个针对 Windows Phone 的项目,但由于缺乏单元测试支持,我有点推迟了[1]。

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

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

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

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

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

我希望了解人们的意见,看看这是一个明智的举动,还是一个愚蠢的差事......

Thanks,
Kieron

[1] 我知道有一些解决方案,但没有一个看起来像完整的框架测试一样集成 - 我特别谈论的是 VS2012/Resharper 中对运行单元测试的支持,而无需模拟器。

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


这就是我们所做的:

  • 将特定于手机的逻辑抽象到外观中
  • 尽可能注入依赖项
  • 避免使用任何需要在构造时在 UI 线程上运行的代码,这意味着任何 UI 控件、ImageSource、基本上任何非枚举的 System.Windows 类型(例如 Visibility)
  • 严重依赖 ValueConverters 将业务逻辑转换为 UI 逻辑。

如果你这样做,那么你can使用内置的 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 单元测试项目,一个普通的,不是一个Windows 应用商店单元测试项目.

3)第三步是包括Windows 手机 8项目作为参考。这有效,您现在可以使用微软假货使mscorlib and 系统.dll,允许你伪造类似的类型DateTime在你的单元测试中,这是一个非常方便的功能。

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

  • 系统.Windows
  • 微软手机

它们可以在C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Tools\MDILXAPCompile\Framework folder.

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

Change:

<Reference Include="System.Windows" />
<Reference Include="Microsoft.Phone" />

To

<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 代码覆盖率功能集成。

NB:单元测试是not这是由 Windows Phone 部门正式支持的,这是我和 Skype 部门的团队找到的解决方法。

奖金答案:

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

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows Phone 开发和单元测试 的相关文章

  • 如何阻止 Python unittest 打印测试文档字符串?

    我注意到 当我的 Python 单元测试在函数顶部包含文档时 有时框架会在测试输出中打印它们 通常 测试输出每行包含一个测试
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 我应该更改单元测试的命名约定吗?

    我目前对单元测试使用一个简单的约定 如果我有一个名为 EmployeeReader 的类 我将创建一个名为 EmployeeReader Tests 的测试类 然后 我在测试类中为该类创建所有测试 名称如下 Reading Valid Em
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • 如何在单元测试中的请求之间更改 $httpBackend when[method] 语句?

    在我的测试中 我启动一些模型数据并模拟响应 beforeEach function var re new RegExp http users online httpBackend whenGET re respond id 12345 us
  • 这可以用 Moq 来嘲笑吗?

    我正在努力模拟一些外部依赖项 并且在一个第三方类中遇到了麻烦 该类在其构造函数中接收另一个第三方类的实例 希望 SO 社区能给我一些指导 我想创建一个模拟实例SomeRelatedLibraryClass它的构造函数接受一个模拟实例Some
  • 如何将Sinon添加到Angular 2测试中?

    我想添加Sinon进行测试 但无法让它运行 我已经安装了 sinon 和 karma sinon 作为 DevDependency 将 sinon 添加到我的 karma 配置文件中的框架中 frameworks jasmine brows
  • 如何在要测试的 React 组件内模拟自定义钩子?

    如果您有一个调用获取数据的自定义挂钩的 React 组件 那么在测试 React 组件时模拟内部自定义挂钩结果的最佳方法是什么 我看到两种主要方法 1 Jest mock 自定义钩子 这似乎是最推荐的方法 但它似乎要求测试对内部实现细节以及
  • Windows Phone 8 中是否有启动完成事件

    Windows Phone 8 中有启动完成触发事件吗 我在谷歌上搜索了很多 但我无法获得有关 Windows Phone 8 中启动触发事件的任何信息 我想在手机重新启动后启动后台进程 为此任何启动完成意图或启动完成触发事件 以便我可以启
  • 将新的 XElement 添加到 Xdocument

    我有以下代码 它成功写入 XML 文件 但是 由于进行了 tagRegistry Save 调用 它每次都会被覆盖 如何将新的 XElement 添加到现有文件 目前该文件只是被覆盖 public void saveTag if File
  • 如何仅在特定错误退出值(0 除外)上将 Jenkins 构建标记为成功?

    当我运行Execute shell构建步骤来执行脚本并且该脚本返回0 Jenkins将构建标记为SUCCESS 否则它将其标记为FAILURE这是预期的默认行为0表示没有错误 任何其他值表示有错误 有没有办法将构建标记为SUCCESS仅当返
  • 如何从 Native 组件向 C#/XAML 组件进行函数调用或触发事件?

    我正在开发一个带有本机 DirectX D3D 组件和 C XAML 组件的 WP8 应用程序 Native 组件绘制 UI 元素 C XAML 组件具有围绕它的应用程序 和其他事物 的控件 通常 我将信息从 C XAML 组件发送到本机组
  • WinRT 不支持 Assembly.GetCallingAssembly,但适用于可移植类库?

    我需要获取有关调用我的组件的程序集的一些元数据 因此 使用Assembly GetCallingAssembly 似乎是天作之合 但是 我发现它在除 Windows 应用商店之外的任何地方都适用 支持的地方 手机7 0 http msdn
  • 使用 AngularJS 制作 Windows Phone 全景图

    我正在尝试在 AngularJS 应用程序中复制 Windows Phone Ui 这是一个example http www expertreviews co uk gallery features 1295629 designing wi
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 如何避免从模拟对象列表返回模拟

    我正在尝试模拟 责任驱动的设计 在对象需要服务来检索其他对象的情况下 我似乎无法避免从模拟返回模拟 一个例子是检查上个月的账单是否已支付的对象 它需要一个检索账单列表的服务 所以我需要在测试中模拟 billRetrievalService
  • 将可区分的联合传递给 InlineData 属性

    我正在尝试对一个解析器进行单元测试 该解析器解析字符串并返回相应的抽象语法树 表示为可区分的联合 我认为使用 Xunit Extensions 属性会非常紧凑InlineData将所有测试用例堆叠在一起
  • 后台地理围栏 Windows Phone 8.1 (WinRT)

    Issue 我试图在 WP8 1 WinRT 中发生地理围栏事件 进入 退出 时触发后台任务 我已经编写了一个示例应用程序来尝试让它工作 但似乎无法做到这一点 到目前为止 我已采取以下步骤来尝试让地理围栏在后台运行 检查位置功能 创建 注册
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦

随机推荐

  • 什么是锯齿状数组?

    什么是锯齿状数组 在 C 中 任何例子以及何时应该使用它 交错数组是数组的数组 string arrays new string 5 这是五个不同字符串数组的集合 每个数组的长度都可以不同 它们也可以是相同的长度 但重点是没有保证他们就是
  • ScrollViewer 上 VerticalOffset 属性的双向绑定?

    我在 Silverlight 3 0 中有一个视图和一个视图模型 该视图包含一个标准的 ScrollViewer 其中包含动态内容 根据 ScrollViewer 中的内容 用户可能已向下滚动内容一半 然后执行导致 ScrollViewer
  • 使用 CSS @font-face 时,浏览器按什么顺序使用不同类型?

    使用时 font faceCSS 中是否记录了每种主要浏览器中适用的字体类型 以及如果缺少一种或多种字体类型 它们对不同字体类型的优先级 我尝试用谷歌搜索答案 但失败了 font face font family myfont src ur
  • 将 int 转换为 BCD 字节数组

    我想使用 BCD 将 int 转换为 byte 2 数组 所讨论的 int 将来自表示年份的 DateTime 并且必须转换为两个字节 是否有任何预制函数可以执行此操作 或者您能给我一个简单的方法来执行此操作吗 example int ye
  • AlertDialog 按钮的图像

    是否可以添加drawables到positive negative and neutralAlertDialog 的按钮 如果是 那么如何 Since onPrepareDialog已弃用 您可以使用onShowListener反而 此外
  • ForbiddenError:无效的 csrf 令牌,express js

    我试图让 csurf 工作 但似乎偶然发现了一些东西 到目前为止的代码如下所示 索引 ejs
  • T-SQL 输出子句:如何访问旧的身份 ID

    我有一个 T SQL 语句 它基本上执行插入并将一些插入的值输出到表变量以供以后处理 有没有办法让我将所选记录的旧身份 ID 存储到我的表变量中 如果我使用下面的代码 我会得到 无法绑定多部分标识符 a ID 错误 DECLARE act
  • 如何使用 ACTION_VIDEO_CAPTURE 操作对相机的意图将文件的输出设置为 mp4?

    当我使用本机应用程序相机拍摄视频时 输出文件的扩展名为 3gp 我需要使用 ACTION VIDEO CAPTURE 意图操作来意图相机 这将生成一个具有 mp4 文件扩展名的文件 我该怎么做 您可以继续尝试 dis 代码 intent n
  • Swagger PHP - 如何定义嵌套属性?

    我正在使用 Swagger PHP 大多数定义都很容易定义 但我遇到了一个特定数据块的问题 该数据块不属于单独的类 而是属于关联数组 我希望显示的 json 响应 针对此问题进行了简化 id 1 status published gps l
  • ipython %timeit“赋值前引用的局部变量‘a’”

    我正在尝试运行以下代码 但我得到了local variable a referenced before assignment a x for x in range 10 b x for x in range 10 timeit a b 该语
  • 如何重新启动 git 仓库?

    我从我的一个旧项目中获取了一个存储库 并编辑了这些文件 以便我可以将其用作新项目的 骨架 说我在这里 骨架 框架 我已经在那里编辑了存储库 我将如何使用该目录中的这些文件重新启动此存储库 什么should我已经做好了 我所做的就是拉取存储库
  • jQuery 单击处理函数不会在 DOM 加载后添加的元素上触发

    我相信我可以使用 live 来做到这一点 但该方法已被弃用 问题是这样的 我有一个点击处理函数 它应该在任何具有 myClickEl 类的元素上触发 这对于加载时文档中存在的 myClickEl 元素效果很好 但是 如果我在 DOM 加载后
  • Spring配置C3P0与Hibernate?

    我有一个 Spring JPA 应用程序 其中 Hibernate 作为 JPA 提供者 我通过以下方式在 Spring 中配置了 C3P0 数据源
  • ASP .NET Core webapi在中间件中设置cookie

    我试图在执行操作后设置一个 cookie 努力使其工作 如果我从控制器而不是中间件设置它 我就能看到cookie 我已经按照配置顺序进行了操作 但什么也没有 代码示例来自一个干净的 webapi 创建的项目 所以如果有人想玩它很简单 只需创
  • Python-从文本文件中查找行号[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在编写在文本文件中查找的代码 并查看输入是否在其中 E g 我输入 披萨 我的文本文件包含 bread pizza pasta tomato 有没有办法打印披萨一词所在的行号
  • 基于 os 系列的 Maven 条件

    我正在尝试执行以下操作
  • 压缩和未压缩的 .wav 文件

    压缩和未压缩的 wav 文件有什么区别 The WAV格式是 Windows 中音频文件的容器格式 WAV 文件由标题和内容组成 标头包含有关 WAV 文件中包含的音频的大小 持续时间 采样频率 分辨率以及其他信息 通常 标头之后是实际的音
  • 使用 print.xtable 更改表格的字体大小

    我想使用 print xtable 更改表格的字体大小 Using print xT size tiny 有效 但我不知道其他尺寸选项 像 size 7pt 这样的东西会很好 您可以使用以下命令选择特定的字体大小 fontsize
  • 捕获更通用的异常类型是否有好处?

    如果我们要捕捉特定形式的IOException 或任何其他类型的 事实上 我们只尝试捕获几个 并为它们定义明确的输出 说 FileNotFoundException ZipException 我们是否应该始终把它拖下来并用一个覆盖所有基地
  • Windows Phone 开发和单元测试

    我希望启动一个针对 Windows Phone 的项目 但由于缺乏单元测试支持 我有点推迟了 1 我习惯于使用 NUnit XUnit 来满足我的大部分测试需求 并使用 NSubstitute 之类的东西来进行模拟 据我所知 您不能将这些框