除了包装的代码之外,是否还应该测试包装器?



单元测试应该测试方法的包装器、方法本身还是两者? 下面是我的意思的一个例子:

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(( 添加测试之前,包装器中应该有多复杂?

单元是否应该测试方法的包装器、方法本身或 双?

单元测试应测试要测试类型的公共接口。如果这两种方法都是公共的,那么您应该测试这两种方法。否则,仅测试公共包装器。

请注意,将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

最新更新