2012-11-07 51 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

对于你的情况,我会创建一个像你的第一个例子中的用户的具体对象。您不需要嘲笑它,因为它存在于被测代码的边界内。

任何存在于被测试代码边界之外并实现数据访问,服务,会话管理等的对象应该有一个接口,以便它们不紧密耦合。有了这些接口,您可以轻松地模拟这些区域,因此不会发生真实世界的数据操作。

相关问题