Moq断言该对象没有改变

时间:2013-11-25 16:29:45

标签: c# .net unit-testing mocking moq

如果我有代码

public Response Foo(Request request)
{
    return _someObject.Bar(request);
}

我可以模拟_someObject,我想声明对象在返回之前没有改变。 e.g:

public Response Foo(Request request)
{
    var response = _someObject.Bar(request);
    return response.SomeProperty.SomeOtherProperty + 1;
}

我知道我可以遍历DTO上的每个成员,但这是任何真正大小或深度的DTO的打字分配。

将对象散列为最佳解决方案,还是有更好的原因?

2 个答案:

答案 0 :(得分:1)

检查DTO上的所有值的另一种方法可能是为它创建一个严格的模拟,然后传递它。 E.g。

var mockRequest = new Mock<IRequest>(MockBehavior.Strict);

如果模拟DTO上有任何意外的属性集,则设置对任何属性的预期,然后将其留给Moq以使测试失败。

答案 1 :(得分:0)

另一种方法是通过使用允许您比较两个对象的任何断言框架来比较调用之前和之后的对象是否相等。如果方法返回相同的对象类型,则可以使用返回的对象将其与原始对象进行比较。否则,如果使用Moq,则可以使用回调来获取依赖项

使用的对象
[Test]
public void Foo_WhenCallingFoo_ShouldNotAlterTheRequest()
{
      var request = new Request();

      var result = Foo(Request);

      result.ShouldBeEquivalentTo(requests);
}

或者,如果测试中的方法返回不同的类型,您可以使用Callback来获取传递给依赖项的对象并与之进行比较:

// Arrange
Request requestUsedBySomeObject = null;
var originalRequest = new Request();
var someObject = new Mock<SomeObject>();
someObject.Setup(s => s.Bar(It.IsAny<Request>()).Callback<Request>(r => requestUsedBySomeObject = r ));

// Act
Foo(originalRequest );

// Assert
originalRequest .ShouldBeEquivalentTo(requestUsedBySomeObject);