什么是修改单元测试的有效解决方案

时间:2014-06-05 07:42:19

标签: unit-testing mocking refactoring

这个问题更像是公开讨论。我想从一个例子开始。假设有一个服务FooService

public interface IFooService { void Method1(){}}
public class FooService: IFooService { void Method1(){ ... }}

为了测试服务,我们编写如下的单元测试代码,没有外部服务

public void TestMethod1(){ ... }

然后假设在Method1中我们需要使用另一个名为AService的类继承自IAService

public interface IAService {void AMethod1(){}}
public class AService : IAService { void AMethod1() {}}
public class FooService : IFooService { 
    private IAService a;
    public FooService (IAService a){ this.a = a;}
    void Method1(){ a.AMethod1(); ..... business logic ..... }
}

然后我们必须重构单元测试以模拟AService

public void TestMethod1(){
     IMockAService aService = MockRepository.StrickMock<IAService>();
     .....
}

因此,当需要更多外部服务时,我们必须添加模拟服务,如果某些服务更改了逻辑或添加或删除参数,等等。如果有100个测试用例,我们必须修改所有测试用例。

那么什么是模拟增加外部服务的最佳解决方案以及处理外部依赖项的任何更改的有效方法,例如:添加/删除方法的参数。

感谢

1 个答案:

答案 0 :(得分:3)

对我来说,大多数时候用Setup方法创建受测试的类就足够了,当构造函数签名发生变化时,只有一个地方可以适应。

或者,您可以将测试类的构造移动到私有方法。

方法也一样。通常,您可以在私有方法中将调用包装到测试中的方法。如果您不必在每个测试中设置所有传递的参数,但是可以使用您在Setup方法中准备的默认值,这将特别有用。