0

我有一个 MVC 项目,其中一个控制器派生自以下结构中的两个基类:

Global Base Controller
|
|--------------------|
Type1               Type2
|                    |
|--------------------------------------|
Controller1/Controller2         Controller3/Controller4

我想设置我的单元测试,以便我只测试 controller1/2/3/4 中的任何覆盖方法,以便我坚持 DRY 原则。这意味着,如果我在其中添加测试,Global Base Controller它们将在链条的下游应用。

使用 NUnit/msTest 实现这一目标的最佳方法是什么?

我已尝试按照以下示例对测试遵循相同的结构,但未选择基本测试:

public class ControllerTestClass<T>
{
    public class ForThisMethod
    {
        [Test]
        public void WhenThisCondition_HasThisValue()
        {
            Assert.IsAssignableFrom<T>("");
        }
    }
}

public class UnitTest2 : ControllerTestClass<String>
{
    [TestFixture]
    public class ForThisMethod2
    {
        [Test]
        public void WhenThisCondition_HasThisValue()
        {
            Assert.True(true);
        }
    }
}

使用上述结构,我在测试资源管理器中看到以下内容:

测试资源管理器的结果

注意:我知道以这种方式进行测试将需要新功能的开发人员添加额外的测试。这很好,将写入项目说明中。

4

1 回答 1

0

我认为您需要以与实现代码相同的方式来考虑您的测试,但不那么“正式”的方式。您正试图使您的测试代码过于复杂。危险在于您最终可能会花费与管理实现代码相同的时间和精力来管理测试代码。

我所做的是将继承用于通用功能,这样我就可以减少编写相同的代码(我相信你在这里尝试实现相同的代码)但我知道我必须重复一些测试代码,这很好,因为这意味着我没有来管理它们。

一般来说,如果您必须编写太多相同的测试方法,那么您可能会发现。需要重新考虑您的实现设计和问题。需要使用 IoC/DI 或类似技术引入代码分离。这样,您的通用代码将只有有限数量的测试,并且特定于不同功能的所有其他代码将被隔离测试。(希望这是有道理的:))

于 2013-10-15T08:11:34.400 回答