我已经使用 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/