unit-testing - 使用 Moq 设置测试的更好方法

标签 unit-testing testing mocking tdd moq

我已经使用 moq 进行了一段时间的模拟,并且总是发现自己在做这样的事情:

假设我要测试的行为是 classUnderTest.DoSomething() 调用 l.Fatal("My test message") 一次。

//arrange
mockLogger.Setup(l => l.Fatal("My test message"));

//act
classUnderTest.DoSomething()

//assert
mockLogger.Verify(l => l.Fatal("My test message"), Times.Once());

我觉得验证调用总是重复设置,除了 Times 参数。我真的很想知道即使使用不同的模拟框架,其他人也在做什么。有一个更好的方法吗?

最佳答案

如果您确实需要控制 Mock 对象的行为,例如返回内容,则只需对 Mock 对象进行设置:

_mockRepo.SetUp(m => m.DoStuff()).Returns(someObject);

或者抛出异常:

_mockRepo.SetUp(m => m.DoStuff()).Throws(new SomeExceptionType());

我假设,在您的示例中,您正在将记录器模拟对象传递给其他被测对象,在这种情况下,删除设置调用将无效,因为只需创建模拟对象即可完成等效设置.

编辑

public class Dude : IDude
{
    private IAirSupport _support;

    public Dude(IAirSupport support)
    {
        _support = support;
    }

    public void Advance(Place place)
    {
        if(place.IsUnderAttack)
        {
            _support.CoveringFire(place);
            MoveAndFire(place);
        }

    }
}

模拟这个:

var support = new Mock<IAirSupport>();

var dude = new Dude(support.Object);

var place = new HotSpot { IsUnderFire = true };


dude.Advance(place);

support.Verify(m => m.CoveringFire(place), Times.Once());

这就是您所需要的 - Verify 完成了所有繁重的工作,没有理由调用设置。

关于unit-testing - 使用 Moq 设置测试的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528748/

相关文章:

c# - 协助使用犀牛模拟测试抽象方法

ruby - 模型中的 RSpec 模拟或 stub super

c++ - 如何在 Visual Studio 中测试已编译的 DLL(或生成多个可执行文件)?

c++ - 我应该如何将包装 API 的对象传递给使用该 API 的类?

ruby - 如何使用 RSpec 断言初始化行为?

c# - 如何使用多个数据源运行单元测试?

unit-testing - 带有 Vuetify 的 Vue Composition Api 未能通过 jest 进行单元测试

android - 如何发送崩溃报告作为Android应用程序的Alpha测试仪?

testing - 如何将 Ivy 凭据传递给脚本测试?

Python 如何重用 Mock 以避免多次编写 mock.patch?