单元测试void方法/模拟对象告诉标志

Gur*_*epS 6 unit-testing mocking

单元测试代码库时,我需要使用模拟对象的迹象是什么?

这会像在代码库中看到很多对其他对象的调用一样简单吗?

另外,我如何单元测试不返回值的方法?因此,如果我的方法返回void但打印到文件,我只是检查文件的内容吗?

模拟是针对外部依赖的,所以这就是一切,不是吗?文件系统,数据库,网络等......

Kir*_*ein 2

如果有的话,我可能过度使用模拟。

每当一个类调用另一个类时,通常我会模拟该调用,并验证该调用是否使用正确的参数进行。在其他地方,我将进行一个单元测试,检查模拟对象的具体代码行为是否正确。

例子:

[Test]
public void FooMoo_callsBarBaz_whenXisGreaterThan5()
{
    int TEST_DATA = 6;
    var bar = new Mock<Bar>();
    bar.Setup(x => x.Baz(It.Is<int>(i == TEST_DATA)))
       .Verifiable();

    var foo = new Foo(bar.Object);

    foo.moo(TEST_DATA);

    bar.Verify();
}

...
[Test]
public void BarBaz_doesSomething_whenCalled()
{
   // another test
}
Run Code Online (Sandbox Code Playgroud)

对我来说,如果我尝试将许多类作为一个大的整体进行测试,那么通常会有大量的设置代码。当您尝试了解所有依赖项时,这不仅读起来相当混乱,而且当需要进行更改时,它也非常脆弱。

我更喜欢小型简洁的测试。更容易编写,更容易维护,更容易理解测试的意图。

  • 您最终会通过模拟将测试与内部实现细节联系起来,这意味着它们往往会更频繁地中断。通过基于状态的测试,您只关心输出。模拟通常设置起来比较混乱,但它们在单元测试中确实占有一席之地。 (4认同)