Example:
public bool Save(MyObj instance)
{
if (instance.IsNew)
{
this.repository.Create(instance);
}
else
{
this.repository.Update(instance);
}
}
如何在 Moq 中创建一个测试来验证:
- 那是一个财产
IsNew
正在阅读
- 要么
Create()
or Update()
已被调用
我的头顶上浮现出:
验证IsNew
正在读取属性:
var mock = new Mock<MyObj>();
mock.Setup(m => m.IsNew).Returns(true).Verifiable();
//...
sut.Save(mock.Object);
//...
mock.Verify();
在上面的例子中,IsNew
财产将归还true
,因此将采用创建路径。
要验证是否调用了 Create 或 Update 方法,您需要对该功能进行一些挂钩。看起来 Repository 是一个静态类,在这种情况下你不能用测试替身替换它,但我可能会以错误的方式读取你的代码......如果你可以用测试替身(模拟)替换它,您可以使用与上述相同的原则。
如果您可以在调用 Save 方法后检查存储库的状态,则可以通过基于状态的测试来判断遵循了哪两个代码路径。
如果没有的话外部可观察到的由于两个代码路径的结果之间存在差异,最好不要测试这个特定的实现细节。它可能会引导您走向一种称为 Overspecified Test 的反模式 - 您可以在这本优秀的书中阅读有关此反模式以及许多其他与单元测试相关的内容的更多信息xUnit 测试模式.
Edit:可以用相同的方式测试存储库:
var myObjMock = new Mock<MyObj>();
myObjMock.Setup(m => m.IsNew).Returns(true);
var repositoryMock = new Mock<Repository>();
repositoryMock.Setup(m => m.Create(myObjMock.Object)).Verifiable();
var sut = new SomeClass(repositoryMock.Object);
sut.Save(myObjMock.Object);
repositoryMock.Verify();
对 Verabilible 的调用是关键。如果没有它,Moq 的默认行为就是让路,尽其所能,并且尽可能不抛出任何异常。
当您调用“可验证”时,您指示模拟期待该特定行为。如果调用Verify时未满足该期望,它将抛出异常,从而导致测试失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)