unit-testing - 我应该在设置中还是在测试用例中初始化模拟对象?

标签 unit-testing mocking tdd

在使用模拟/假对象的单元测试中,我想知道如果我的测试类包含测试同一类的方法(因此,假对象),在 SetUp 中还是在测试方法本身中初始化模拟是否更可取所有测试用例所需的值应该相同)。像这样的事情:

class FooTests
{
    Mock<IBar> mockBar;
    Foo fooUnderTest;

    [SetUp]
    public void Setup()
    {
        mockBar = new Mock<IBar>();
        fooUnderTest = new fooUnderTest(mockBar.Object);
    }

    [Test]
    public void MyTest()
    {
        //setup mock methods
        mockBar.SetUp( ... )

        //test
        fooUnderTest.TestSomething()

        //assert something here

    }
}

这似乎会阻止我们在每个测试用例中将代码复制到mockBar和fooUnderTest,但缺点是我必须声明类变量mockBar和fooUnderTest(或者这真的是一个缺点吗?),并且它将是如果我想要一些特殊的设置(例如,如果在某些测试用例中我想覆盖 Foo 的一些虚拟方法),则会出现问题。有什么建议最好的做法是什么?

最佳答案

  • 如果有一些通用设置由套件/固定装置中的所有测试共享(包括对模拟协作者设置一些期望),移至设置方法。 (对于测试中与读者无关的附带细节,也是如此)
  • 如果一个测试用例想要扩展通用设置,请在测试用例本身中添加特定的内联设置
  • 如果一个测试用例想要不同的设置(尽管有很大的重叠),移动到不同的测试套件并找出一些其他机制来共享设置(例如通过组合、实用方法、对象母体等)

关于unit-testing - 我应该在设置中还是在测试用例中初始化模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190863/

相关文章:

java - sax解析器的单元测试

javascript - 在 Sequelize 中模拟

unit-testing - 为WebRole云服务项目设置单元测试?

javascript - Javascript 中的 Qunit 测试

spring - 用另一个上下文中的模拟版本替换一个上下文中的 spring bean

android - Robotium:验证 Activity 是否完成,并且在单击 "home"按钮时底层的 Activity 已恢复

c# - 学习TDD,总是陷入循环依赖

php - 在使用 PHPUnit 进行测试时使用实现 IteratorAggregate 接口(interface)的 Mock 类时如何防止重新声明错误?

unit-testing - 如何使用 with-redefs 模拟对同一函数的多次调用?

tdd - Gallio Icarus 与 Testdriven.net