gpt4 book ai didi

TDD 和模拟

转载 作者:行者123 更新时间:2023-12-01 11:06:18 25 4
gpt4 key购买 nike

首先,我不得不说,我是模拟的新手。所以也许我漏掉了一点。

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

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

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

简单的例子:

public void CreateAandB(bool arg1, bool arg2) {
if(arg1)
daoA.Create();
else throw new exception;
if(arg2)
daoB.Create();
else throw new exception;
}

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

我错过了什么吗?

最佳答案

您有 2 个选择。如果该方法会导致您的类发生某些变化,您可以改为测试方法的结果。那么你可以调用 CreateAandB(true,false) 然后调用其他方法来查看是否创建了正确的东西。在这种情况下,您的模拟对象可能是仅提供一些数据的 stub 。

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

是的,您正在测试实现细节,但您正在测试的细节如果您的方法正确使用了它的依赖项,这就是您要测试的内容,而不是如何它正在使用它们,这些是您并不真正感兴趣的细节。

编辑

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,此后可能已更改,编辑 see here 以获得可能有效的选项 ), 但似乎有人开发了一种方法可以允许这个 here .我从未使用过它,也无法验证它。

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

  • 在您的异常中有不同的消息并检查它以确定引发了哪个异常。
  • 除了预期异常外,还预期调用 daoA。如果您没有收到对 daoA 的调用,那么测试将失败,因为异常一定是第一个。

关于TDD 和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5566719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com