2015-04-22 79 views
1

说我有像服务,以便:现在单元测试嵌套方法

public class MyService : IMyService 
{ 
    public void DoStuff(IDependency dependency, string value) 
    { 
     dependency.SomeMethod(value, true); 
     DoOtherStuff(dependency); 
    } 

    public void DoOtherStuff(IDependency dependency) 
    { 
     // do some stuff 
    } 
} 

,当单元测试MyService,我可以模拟的依赖性足够容易地和测试被适当地使用的依赖性:

public void MyServiceTest() 
{ 
    // Arrange 
    var mockDependency = new Mock<IDependency>(); 
    mockDependency.Setup(m => m.SomeMethod()); 
    var service = new MyService(); 

    // Act 
    service.DoStuff(mockDependency.Object, "value"); 

    // Assert 
    mockDependency.Verify(v => v.SomeMethod(), Times.Once); 
} 

如何测试服务电话DoOtherStuff?或者这是一种不好的模式?什么是正确的方法来做到这一点?

回答

2

你不应该对单元测试怎么在意特定的公共功能,只要它满足其合同执行。

注意:上面的“公共”一般用于“外部可用”,通常它与C#public一致,但有时候您需要/必须将其他方法标记为公共,即使它不是外部合同的一部分。

如果你真的必须测试DoOtherStuff被调用,你可以使用该方法virtual并使用测试实现提供它自己的版本,以某种方式通知你关于该调用(可能Moq也可以为你创建一个)。

2

对您想要使用MOQ另一个类,如写的。

然而,类测试,我认为你不应该在您的测试两种方法分离出来,为您不要测试私有方法类似的原因。如果代码被重构,以至于如果测试失败,则不会调用第二个方法。不,公共API不受影响。

更好地做出关于应该发生依赖性,DoOtherStuff被调用,因为你现在做什么断言。

+0

作为一个说明(故意在回答身体不把),如果该方法是虚拟的,你可以在您的测试覆盖它们。但是,我不认为这在大多数情况下是非常有用的。我认为我们为什么关心某些事情的核心是Times.Once,因为它是类之间的交互。另外'Delegate.CreateDelegate数据(Metadata >等etc'。也有黑暗的一面的方式,但我不是非常熟悉。 –