2012-11-07 63 views
2

在測試方法中傳遞對象參數的最佳做法是什麼? 在這種情況下使用什麼(嘲笑,存根或創建對象的實例並填寫)如何在測試方法中使用模擬參數或實例參數?

例如:

[Test] 
public void LoadContentsFor_ValidUser_ReturnsEmptyList() 
{ 
    var user = new User {Id = 1, FirstName = "Test"}; 
    var contents = this.contentPresentationService.LoadContentsFor(user); 
    Assert.IsTrue(contents.Count == 0); 
} 

或者用嘲笑:

[Test] 
public void LoadContentsFor_ValidUser_ReturnsEmptyList() 
{ 
    var user = new Mock<User>(); 
    user.Setup(x => x.Id).Returns(1); 
    user.Setup(x => x.FirstName).Returns("Test"); 
    var contents = this.contentPresentationService.LoadContentsFor(user.Object); 
    Assert.IsTrue(contents.Count == 0); 
} 

回答

1

如果是這樣簡單的對象我建議要麼手工創建它或使用一些建築工具,如AutoFixtureNBuilder(這兩個庫是專門用來對付你問的具體問題):

// AutoFixture example 
var fixture = new Fixture(); 
var user = fixture 
    .Build<User>() 
    .With(u => u.Id, 1) 
    .With(u => u.FirstName, "John") 
    .CreateAnynomous(); 

最重要的是,AutoFixture提供了更多實用的功能,比如

  • autogenerating數據性能
  • 跳過不需要的屬性
  • 用automocks替換某些屬性(給AutoMoq一看)

功能,嘲笑框架不提供,因爲他們服務於不同的角色。當然沒有任何反應如果你仍然繼續使用模擬,但考慮到他們前面提到的不同目的,可能是混淆了讀者的代碼。

1

對於你的情況,我會創建一個像你的第一個例子中的用戶的具體對象。您不需要嘲笑它,因爲它存在於被測代碼的邊界內。

任何存在於被測試代碼邊界之外並實現數據訪問,服務,會話管理等的對象應該有一個接口,以便它們不緊密耦合。有了這些接口,您可以輕鬆地模擬這些區域,因此不會發生真實世界的數據操作。

相關問題