2017-07-19 19 views
0

单元测试应该测试方法的包装器,方法本身还是两者? 这里是我的意思的例子:)包装是否应该在包装代码的基础上进行测试?

public static class Helper 
{ 
    public static bool DoAThing() { 
    //do stuff... 
    } 
} 

[TestClass] 
public class HelperTests 
{ 
    [TestMethod] 
    public void TestDoAThing() 
    { 
     Assert.AreEqual(true, Helpers.DoAThing()); 
    } 
} 

public class APIMethodsController : ApiController 
{ 
    public bool DoAThingWrapper() 
    { 
     return Helpers.DoAThing(); 
    } 
} 

所以应该有除了TestDoAThing是DoAThingWrapper()的测试(?

我倾向于认为对于像这样的简单情况,应该只有TestDoAThing()。但是在为DoAThingWrapper()添加测试之前,包装器中应该有多复杂?

回答

3

如果一个单元测试的方法的包装中,该方法本身,或二者 ?

单元测试应测试您正在测试的类型的公共接口。如果两种方法都是公开的,那么你应该测试它们。否则,只测试公共包装。

请注意,您将DoAThing()定义为静态类的实例方法,这在C#中是不允许的。你也称它为APIMethodsControllerApiController类的实例方法,虽然它在Helper类中定义。

虽然有一些方法可以对依赖于静态的代码进行单元测试(例如TypeMock或Moles),但我建议您依赖于抽象。这将使你的代码容易通过嘲笑其依赖性进行单元测试。例如。而不是使用Helper.DoAThing()这是很难做回你的测试所需的值,你可以创建调用静态成员的包装:

public class HelperWrapper : IHelper 
{ 
    public bool DoAThing() => Helper.DoAThing(); 
} 

现在你可以很容易地嘲笑IHelper和测试装饰它用它做成的肯定DoAThing依赖被调用。我对ConfigurationManager课使用相同的技巧。

var helper = new Mock<IHelper>(); 
helper.Setup(h => h.DoAThing()).Returns(false); 
var controller = new APIMethodsController(helper.Object); // inject dependency 
var result = controller.DoAThingWrapper(); 
result.Should().BeFalse(); // ensure you pass through value from helper 
+0

修复了您提到的代码。 – Riddari