当前位置 : 主页 > 手机开发 > 其它 >

单元测试 – 使用Moq设置测试的更好方法

来源:互联网 收集:自由互联 发布时间:2021-06-22
我一直在嘲笑使用moq一段时间,并总是发现自己做这样的事情: 假设我想测试的行为是classUnderTest.DoSomething()调用l.Fatal(“我的测试消息”)一次. //arrangemockLogger.Setup(l = l.Fatal("My test messa
我一直在嘲笑使用moq一段时间,并总是发现自己做这样的事情:

假设我想测试的行为是classUnderTest.DoSomething()调用l.Fatal(“我的测试消息”)一次.

//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对象上进行设置,比如返回东西:

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

或抛出异常:

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

我假设,在您的示例中,您将记录器模拟对象传递给其他正在测试的对象,在这种情况下,删除设置调用将不起作用,因为等效设置将仅通过创建Mock对象来完成.

编辑

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());

这就是你所需要的 – 验证所有繁重的工作,没有理由调用设置.

网友评论