3

感谢任何好的示例或网站参考,其中包含使用 Rhino Mocks 将 TDD 与 Model-View-Presenter 模式结合使用的有用信息。

我正在寻找的是关于以下几点

  • 模拟什么(查看和演示者)
  • 新的 AAA 语法
  • 如何模拟 UI 行为?例如,如果在视图中输入“firstName”和“lastName”启用“提交”按钮,否则禁用它。这只是一个简单的例子。
  • 最佳实践

非常感谢这个方向的任何输入。

提前致谢。

4

2 回答 2

4

既然你还没有得到答案,我会尽我所能,用我目前所学的;

第一个问题;模拟什么 - 通常你会模拟你没有测试的所有东西。因此,如果您正在测试 ViewModel,您将模拟更改 ViewModel 的视图代码,以及填充/保留 ViewModel 的模拟模型代码。

第二个问题;AAA 语法 - AAA 语法最容易通过在您的测试方法中添加以下类型的注释来保持;

[Test]
public void whenUserFillsInFirstAndLastName_ThenUserCanSubmit()
{
    // Arrange - code used to set-up what you are testing.
    this.loadViewModelWithInitalContext(viewModel); // This is a helper that loads the viewmodel

    // Act - code to fullfil the 'when' part in the test.
    this.viewModel.FirstName = "test";
    this.viewModel.LastName = "me";

    // Assert - code to check state of object being tested. (here I am testing a property that I bind to the enabled state of a submit type button)
    Assert.IsTrue(this.viewModel.UserCanSubmit);
}

第三个问题,模拟 UI 行为——通常你把它放在测试的 Act 部分(用于测试 ViewModel)。

最后一个问题,最佳实践,我的经验表明;

  • 一次只断言一件事,那么您的测试将因一次失败而失败,并且您将在找出问题所在时为自己节省大量时间。您甚至可以为每个断言设置一个测试方法,但要问一个关于如何做到这一点的新问题,因为它需要 AAA 语法的不同实现才能使事情变得易于管理。
  • 使用依赖注入,因为它使代码更容易模拟。
  • 让你的测试尽可能的轻量——不要去数据库或磁盘,你希望你的测试快速,所以开发人员尽可能频繁地执行它们。如果我需要 5 分钟来完成测试,我会厌倦等待。如果我需要 10 秒,我愿意更频繁地这样做。
  • 最后——但也是最重要的——确保在团队中任何人的每一次签到时都执行所有单元测试。这将使您的测试保持最新,并使您的代码库更加稳定。尽可能频繁地使用 CruiseControl.net 等集成平台在单独的服务器上构建。线索是,如果有人/事物破坏了构建,您想尽快知道。

我推荐的参考资料;使用“你最喜欢的搜索引擎”来搜索你想做的事情,或者在这里发布你的测试示例并获得评论——这将帮助你改进你正在做的事情。

于 2009-06-03T20:02:31.727 回答
1

Phil Haack 对此有一篇非常好的博客文章。下载源代码并查看测试,它们的评论非常好。

于 2009-06-23T21:21:32.143 回答