首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TDD和模拟

TDD和模拟
EN

Stack Overflow用户
提问于 2011-04-06 20:57:15
回答 2查看 650关注 0票数 3

首先,我要说的是,我对mocking还不熟悉。所以也许我漏掉了一点。

我也刚刚开始习惯TDD方法。

因此,在我的实际项目中,我正在处理业务层中的一个类,而数据层尚未部署。我想,这将是一个开始模仿的好时机。我正在使用Rhino Mock,但我遇到了一个问题,即在编写类本身之前需要知道类的实现细节。

Rhino Mocks检查所有预期被调用的方法是否被实际调用。因此,我经常需要知道被测试的方法首先调用的是哪个模拟方法,即使它们可以以任何顺序调用。正因为如此,我经常在测试之前编写复杂的方法,因为这样我就已经知道方法被调用的顺序。

简单的例子:

代码语言:javascript
复制
public void CreateAandB(bool arg1, bool arg2) {
    if(arg1)
        daoA.Create();
    else throw new exception;
    if(arg2)
        daoB.Create();
    else throw new exception;
}

如果我想测试这个方法的错误处理,我必须知道哪个方法是首先被调用的。但我不想在第一次编写测试时被关于实现细节的问题所困扰。

我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-06 21:07:28

你有两个选择。如果该方法将导致类中的某些更改,则可以改为测试方法的结果。所以你能不能先调用CreateAandB(true,false),然后调用其他方法,看看是否创建了正确的东西。在这种情况下,您的模拟对象可能是存根,它只提供一些数据。

如果doaAdoaB是注入到您的类中的对象,它们实际上在DB或类似的地方创建数据,您无法在测试中验证它们的结果,那么您需要测试与它们的交互,在这种情况下,您创建模拟并设置期望,然后调用方法并验证期望是否满足。在这种情况下,您的模拟对象将是模拟的,并将验证预期的行为。

是的,您正在测试实现细节,但您正在测试您的方法是否正确使用其依赖项的细节,这是您想要测试的,而不是它如何使用它们的细节,这是您并不真正感兴趣的细节。

编辑

代码语言:javascript
复制
IDao daoA = MockRepository.GenerateMock<IDao>(); //create mock
daoA.Expect(dao=>dao.Create); //set expectation

...

daoA.VerifyExpectations(); //check that the Create method was called

您可以确保期望以特定的顺序发生,但不使用我认为的AAA语法(source from 2009,可能已经更改,编辑 以获得一个可能适用于的选项),但似乎有人已经开发了一种可能允许此here的方法。我从来没有使用过它,也无法验证它。

至于需要知道哪个方法首先被调用,以便您可以验证异常,您有两个选择:

  • 在你的异常中有一条不同的消息,并检查它来确定哪个异常是对daoA的调用,除了期望异常之外。如果您没有调用daoA,那么测试将失败,因为异常必须是第一个异常。
票数 4
EN

Stack Overflow用户

发布于 2011-04-06 21:14:02

通常情况下,您只需要假对象,而不是mock。模拟对象用于测试组件交互,通常可以通过直接查询SUT的状态来避免这种情况。mocks的最实际用途是测试与某些外部系统(DB、文件系统、webservice等)的交互,对于其他方面,您应该能够直接查询系统状态。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5566719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档