使用MVVM编写可测试的表示层

在使用 Windows 窗体时代的传统应用程序的情况下,标准测试做法是布局一个视图,在该视图的代 码隐藏文件中编写代码,然后运行该应用程序以进行测试。幸运的是,在那以后,相关做法有了一些变 化。

Windows Presentation Foundation (WPF) 的出现将数据绑定概念提升到了一个全新的水平。它使得 一种称为“模型-视图-视图模型”(MVVM) 的新设计模式得到发展。通过 MVVM,您可以将表 示逻辑与实际表示分离开。基本上,这意味着您可以在极大程度上避免在视图的代码隐藏文件中编写代 码。

对于那些对开发可测试应用程序感兴趣的人来说,这是一项重大改进。现在,您不必将表示逻辑附加 到视图具有自身生命周期的代码隐藏文件(从而使测试变得复杂),而是可以使用普通的旧 CLR 对象 (POCO)。视图模型没有视图所具有的生命周期约束。您可以在单元测试中将某个视图模型实例化并进行 测试。

在本文中,我将介绍如何着手使用 MVVM 编写应用程序的可测试表示层。为了帮助说明我的方法,我 在这里提供了我曾编写的一个开放源框架(称为 Charmed)中的示例代码,以及随附的示例应用程序( 称为 Charmed Reader)。此框架和示例应用程序可在 GitHub 上找到 (github.com/brentedwards/Charmed)。

我曾在 2013 年 7 月的文章中将该 Charmed 框架作为 Windows 8 框架和示例应用程序进行了介绍 (msdn.microsoft.com/magazine/dn296512)。随后,在 2013 年 9 月的文章 (msdn.microsoft.com/magazine/dn385706) 中,我又将其作为 Windows 8 和 Windows Phone 8 框架和 示例应用程序讨论了如何实现跨平台应用。在这两篇文章中,我都谈到我为了保持该应用程序的可测试 性而做出的决定。现在,我将再次讨论这些决定,并说明如何实际着手测试该应用程序。本文中的示例 采用 Windows 8 和 Windows Phone 8 代码,但您可以将这些概念和方法应用于任何类型的应用程序。

关于示例应用程序

用于说明我如何着手编写可测试表示层的示例应用程序名为 Charmed Reader。Charmed Reader 是一 个简单的博客阅读器应用程序,可在 Windows 8 和 Windows Phone 8 上运行。它具有说明我要涉及的 要点所需的最少功能。此应用程序可跨平台运行,并且在两个平台上的运行方式几乎相同,不同之处在 于,Windows 8 应用程序会利用某些 Windows 8 特有的功能。而应用程序基本上相同,具有单元测试所 需的足够功能。

什么是单元测试?

所谓单元测试,就是获取离散代码块(单元)并编写以预期方式使用代码的测试方法,然后进行测试 ,看是否可以取得预期结果。此测试代码使用某种测试工具框架运行。有多种适用于 Visual Studio 2012 的测试工具框架。在该示例代码中,我使用了 Visual Studio 2012(以及更早版本)中内置的 MSTest。目标是让单一单元测试方法面向某个具体方案。有时,需要使用多个单元测试方法才能涵盖您 预期您的方法或属性适用的所有方案。

单元测试方法应遵循一致的格式,以便于其他开发人员理解。以下格式通常被视为最佳做法:

Arrange

Act

首先,为创建被测试类的实例以及它可能具有的任何依赖关系,您可能需要编写一些设置代码。这是 单元测试的 Arrange 部分。

在完成为该单元测试设置实际测试阶段之后,您可以执行相关方法或属性。这是单元测试的 Act 部 分。您可以使用在 Arrange 部分中设置的参数(如果适用)执行相关方法或属性。

最后,在执行了相关方法或属性后,测试需要验证该方法或属性的运行结果是否与预期完全一致。这 是单元测试的 Assert 部分。在断言阶段,将会调用断言方法以将实际结果与预期结果进行比较。如果 实际结果符合预期,则单元测试通过。如果不符合,则测试失败。

我的测试遵循这种最佳实践格式,通常看上去与下面类似:

          [TestMethod]
public void SomeTestMethod()
{
  // Arrange
  // *Insert code to set up test
  // Act
  // *Insert code to call the method or property under test
  // Assert
  // *Insert code to verify the test completed as expected
}

某些人虽然使用这种格式,但没有包括用于调用该测试不同部分 (Arrange/Act/Assert) 的注释。我 喜欢用注释将这三个部分分开,只是为了确保保持对实际测试内容或何时进行设置的跟踪。

拥有一整套编写良好的单元测试的另一个好处是,它们可以充当该应用程序的活文档。查看您的代码 的新开发人员可以查看这些单元测试所涉及的不同方案,从而了解您期望如何使用该代码。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mvvm开发
, 测试
, mvvm
, 视图
, 单元测试
, mvvm框架的avalon
, 应用程序
, 代码
, 该程序如何编写
, 示例
, 视图示例
mstest
ios mvvm框架使用教程、mvvm框架使用、mvvmlight使用、android mvvm 使用、如何编写测试用例,以便于您获取更多的相关知识。

时间: 2024-10-26 05:33:14

使用MVVM编写可测试的表示层的相关文章

编写可测试的 JavaScript

Twitter 的工程师文化要求进行测试,许多的测试.在进入 Twitter 之前我还未有过测试 JavaScript 的经验,所以在这之后我学习到了很多.特别是学到了许多过去我使用.书写和鼓励使用的代码其实是不利于书写可测试的代码的.所以我觉得在此分享我所学习到有价值的,如何书写可测试的 JavaScript 几条最重要的原则.这里提供的这些示例虽然基于 QUnit,但是也应该适用于其他的 JavaScript 测试框架. 避免单例 我最受欢迎的博文中的其中一篇就是关于如何使用 JavaScr

编写Android测试单元该做的和不该做的事

在本文中, 我将根据我的实际经验,为大家阐述一个编写测试用例的最佳实践.在本文中我将使用 Espresso 编码, 但是它们可以用到单元测试和仪器测试(instrumentation test)当中.基于以上目的,我们来研究一个新闻程序. 以下内容纯属虚构,如有雷同纯属巧合 :P 一个新闻 APP 应该会有以下这些 activity. 语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言.选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity. 新闻列表 - 当用户来到新闻列

编写 android 测试单元该做的和不该做的事

一个新闻 APP 应该会有以下这些 activity.   语言选择 - 当用户第一次打开软件, 他必须至少选择一种语言.选择后,选项保存在共享偏好中,用户跳转到新闻列表 activity.   新闻列表 - 当用户来到新闻列表 activity,将发送一个包含语言参数的请求到服务器,并将服务器返回的内容显示在 recycler view 上(包含有新闻列表的 id, news_list). 如果共享偏好中未存语言参数,或者服务器没有返回一个成功消息, 就会弹出一个错误对话框并且 recycle

一步步教你编写可测试的Go语言代码_Golang

第一个测试 "Hello Test!" 首先,在我们$GOPATH/src目录下创建hello目录,作为本文涉及到的所有示例代码的根目录. 然后,新建名为hello.go的文件,定义一个函数hello() ,功能是返回一个由若干单词拼接成句子: package hello func hello() string { words := []string{"hello", "func", "in", "package&q

《编写可测试的JavaScript代码》——1.4 小结

1.4 小结 编写可测试的JavaScript代码,并不能自动从敏捷.瀑布.TDD.BDD或任何其他软件开发方式中产生结果.可测试的JavaScript是编写短小.松耦合.独立的简单小块代码的一个保证.如何编写这样的代码取决于我们自己.希望本书能够帮助大家了解编写这种代码的方式. 编写可测试的代码会让我们的工作以及后续者的工作变得更加容易.从更少的Bug到更容易修复的Bug,从容易测试到简单调试,编写可测试的JavaScript是让我们保持清醒的方式. 最重要的是,不要忘记我们是为人编写代码,而

《编写可测试的JavaScript代码》——第1章 可测试的JavaScript

第1章 可测试的JavaScript 每个人的想法都是独一无二的,但代码不是.几乎每个行业都完成了机器革命,然而奇怪的是,计算机科学行业并没有.程序员基本上是在做已经做了40年的同样的事情.手工编写代码,接着这些代码被编译或解释,然后执行.看看输出结果,再确定是否需要再改代码.计算机科学的黎明到来之前,这种开发周期就一直这样保持不变.我们的机器在几何级变快,内存和二级存储大小是无限制的,且这样发展下去软件越来越复杂.但我们仍然一个字母一个键地手工编写着代码.我们依然滥用着"print"

《编写可测试的JavaScript代码》——第1章 可测试的JavaScript 1.1 现有技术

第1章 可测试的JavaScript 每个人的想法都是独一无二的,但代码不是.几乎每个行业都完成了机器革命,然而奇怪的是,计算机科学行业并没有.程序员基本上是在做已经做了40年的同样的事情.手工编写代码,接着这些代码被编译或解释,然后执行.看看输出结果,再确定是否需要再改代码.计算机科学的黎明到来之前,这种开发周期就一直这样保持不变.我们的机器在几何级变快,内存和二级存储大小是无限制的,且这样发展下去软件越来越复杂.但我们仍然一个字母一个键地手工编写着代码.我们依然滥用着"print"

编写可测试的JavaScript代码

无论我们使用和Node配合在一起的测试框架,例如Mocha或者Jasmine,还是在像PhantomJS这样的无头浏览器中运行依赖于DOM的测试,和以前相比,我们有更好的方式来对JavaScript进行单元测试. 然而,这并不意味着我们要测试的代码就像我们的工具那样容易!组织和编写易于测试的代码需要花费一些精力和并对其进行规划,但是在函数式编程的启发下,我们发现了一些模式,当我们需要测试我们的代码时,这些模式可以帮助我们避免那些"坑".在这篇文章中,我们会查看一些有用的小贴士和模式,来

《编写可测试的JavaScript代码》——1.3 卓越的应用程序代码

1.3 卓越的应用程序代码 编写短小.可测试的代码后工作并没有结束,还需要测试它!编写可测试的代码,可以让测试以及找Bug变得更容易.没有开发人员愿意尝试去调试一段巨大的代码,特别是如果这些代码不是他编写的. 1.3.1 测试 单元测试是开发者的第一道防线.单元测试不仅能强迫开发人员理解我们的代码,也能帮助我们记录和调试代码.除了单元测试以外,集成测试也有助于确保一切都能按预期集成在一起-尤其是客户端JavaScript,它运行在更多平台(台式机.平板电脑和手机)上的不同浏览器上.最后,性能测试