c# - NUnit - 如何测试实现特定接口(interface)的所有类

标签 c# .net unit-testing nunit

如果我有接口(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/

相关文章:

c# - 为什么必须在 Compare 方法的实现中包含接口(interface)名称?

c# - 想要在 gridview 的一列中获取相同字符串值的总数

c# - 为什么 Intellisense 看到命名空间,而编译器却看不到?

c# - 如何将常用图像格式保存到DICOM?

java - 如何对使用 Scanner 和 InputStream 的方法进行单元测试?

android - 如何对 android 中事件总线发布的方法进行单元测试?

c# - 如何在不装箱的情况下比较 System.Enum 和枚举(实现)?

c# - Entity Framework : Composite Foreign Key on unique (not primary keys) parent fields

.net - .net framework 4.5 向后兼容

ios - 如何在 UIViewController 中对 UICollectionView 进行单元测试