【问题标题】:Structuring tests for inherited architecture继承架构的结构化测试
【发布时间】:2013-10-15 07:41:25
【问题描述】:

我有一个 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);
        }
    }
}

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

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

【问题讨论】:

    标签: c# unit-testing nunit mstest


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多