2013-11-25 42 views
0

如果我的代碼起訂量斷言對象未改變

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

我可以嘲笑_someObject,我想斷言對象沒有返回之前改變。例如: -

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

我知道我可以通過對DTO每個成員走,但這是打字配發任何實際尺寸或深度的任何DTO的。

哈希的對象是最好的解決方案,還是有更好的爲什麼?

+0

你可以嘲笑的DTO,'請求'? –

+0

我想......這意味着要爲DTO添加接口。我沒有想到這一點。 – BanksySan

回答

1

檢查DTO上所有值的替代方法可能是爲它創建一個嚴格模擬,然後通過它。例如。

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

設置的任何屬性的預期變得像往常一樣,然後把它留給起訂量失敗,你的測試,如果有任何意外的屬性集上的模擬DTO。

+0

我認爲這可能是最好的解決方案......仍然不喜歡把界面放在我的DTO上......但我不確定爲什麼我不喜歡它。 – BanksySan

0

另一種方法是通過使用允許您比較兩個對象的任何斷言框架來比較調用前後的對象是否相等。如果方法返回相同的對象類型,則可以使用返回的對象將其與原始對象進行比較。否則,你可以使用一個回調,如果使用的起訂量,來獲得該依賴

[Test] 
public void Foo_WhenCallingFoo_ShouldNotAlterTheRequest() 
{ 
     var request = new Request(); 

     var result = Foo(Request); 

     result.ShouldBeEquivalentTo(requests); 
} 

或者,如果在測試方法返回一個不同的類型,你可以使用回調以獲取傳遞給該對象使用的對象依賴和比較:

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