如果我有接口(interface) IFoo,并且有几个实现它的类,那么根据接口(interface)测试所有这些类的最佳/最优雅/最聪明的方法是什么?
我想减少测试代码重复,但仍然“忠于”单元测试的原则。
您认为最佳做法是什么?我正在使用 NUnit,但我想来自任何单元测试框架的示例都是有效的
最佳答案
如果您有类实现任何一个接口(interface),那么它们都需要实现该接口(interface)中的方法。为了测试这些类,您需要为每个类创建一个单元测试类。
让我们走一条更聪明的路线吧;如果您的目标是避免代码和测试代码重复,您可能希望创建一个抽象类来代替处理重复 代码。
例如你有以下界面:
public interface IFoo {
public void CommonCode();
public void SpecificCode();
}
你可能想创建一个抽象类:
public abstract class AbstractFoo : IFoo {
public void CommonCode() {
SpecificCode();
}
public abstract void SpecificCode();
}
测试很简单;将测试类中的抽象类实现为内部类:
[TestFixture]
public void TestClass {
private class TestFoo : AbstractFoo {
boolean hasCalledSpecificCode = false;
public void SpecificCode() {
hasCalledSpecificCode = true;
}
}
[Test]
public void testCommonCallsSpecificCode() {
TestFoo fooFighter = new TestFoo();
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
...或者让测试类扩展抽象类本身,如果这符合您的喜好。
[TestFixture]
public void TestClass : AbstractFoo {
boolean hasCalledSpecificCode;
public void specificCode() {
hasCalledSpecificCode = true;
}
[Test]
public void testCommonCallsSpecificCode() {
AbstractFoo fooFighter = this;
hasCalledSpecificCode = false;
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
让抽象类处理接口(interface)隐含的公共(public)代码可以提供更简洁的代码设计。
我希望这对你有意义。
作为旁注,这是一种常见的设计模式,称为 Template Method pattern 强>。在上面的示例中,模板方法是 CommonCode
方法,而 SpecificCode
称为 stub 或 Hook 。这个想法是任何人都可以扩展行为而不需要知道幕后的东西。
很多框架都依赖于这种行为模式,例如ASP.NET您必须在页面或用户控件中实现 Hook ,例如由 Load
事件调用的生成的 Page_Load
方法,模板方法调用后面的 Hook 场景。这方面的例子还有很多。基本上,您必须实现的任何使用“加载”、“初始化”或“呈现”等词的内容都由模板方法调用。
关于c# - NUnit - 如何测试实现特定接口(interface)的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003/