使用NUnit在派生类中设置?

使用NUnit在派生类中设置?,nunit,Nunit,如果我有以下代码: [TestFixture] 公共类MyBaseTest { 受保护的ISessionManager_sessionManager; [设置] public void SetUp(){/*初始化_sessionManager*/}的一些代码 } [测试夹具] 公共类MyDerivedTest:MyBaseTest { IBlogRepository(IBlogRepository);; [设置] public void SetUp(){/*初始化_repository*/}的一

如果我有以下代码:

[TestFixture]
公共类MyBaseTest
{
受保护的ISessionManager_sessionManager;
[设置]
public void SetUp(){/*初始化_sessionManager*/}的一些代码
}
[测试夹具]
公共类MyDerivedTest:MyBaseTest
{
IBlogRepository(IBlogRepository);;
[设置]
public void SetUp(){/*初始化_repository*/}的一些代码
[测试]
public void BlogRepository_testgoesher(){/*某些测试*/}
}
…NUnit不调用基本设置例程。这是意料之中的,我对它本身没有问题。我可以让派生设置首先调用基本设置,如下所示:

[TestFixture]
公共类MyDerivedTest:MyBaseTest
{
IBlogRepository(IBlogRepository);;
[设置]
公共新的无效设置()
{
base.SetUp();
/*一些初始化存储库的代码*/
}
这很难看。如果它是一个构造函数,我就不必了

我可以使用“模板方法”模式,并具有以下功能:

public void MyBaseTest
{
抽象空设置();
[设置]
public void BaseSetUp()
{
/*基本初始化*/
SetUp();//虚拟调用
}
}
我也不是特别喜欢这个


当它们的测试类需要设置,并且它们是从另一个同样需要设置的类派生的时,您会怎么做?

您必须直接调用该方法

   [SetUp]
   public void DerivedSetUp()
   {
      base.BaseSetUp();
      // Do something else
   }
编辑:我还没有试过,但也许部分方法也可以。不过我更喜欢上面的方法


Edit2:我刚刚尝试使用分部方法。它不起作用。即使它起作用,我认为调用基类仍然会更容易。

您显式地拥有基类。鉴于NUnit使用[Setup]属性标记测试设置,我认为这是“正确的事情”因为它遵循通常的语言规则

当然,NUnit可以搜索基类,并自动调用它们的设置函数,但我认为这对大多数人来说是相当令人惊讶的

但是,至少有一个单元测试框架使用构造函数进行设置:。在这里,基类设置被自动调用,因为这是C#中构造函数的行为方式


(不过请注意,xUnit.Net建议再次使用测试设置。)

以下内容适用于MbUnit。它也可能适用于NUnit

[TestFixture]
public abstract class Base {
    [SetUp]
    public virtual void SetUp() {
        //Some stuff.
    }
}

public class Derived : Base {
    public override void SetUp() {
        base.SetUp();
        //Some more stuff.
    }
    [Test]
    public virtual void Object_WhenInACertainState_WhenAMethodIsCalled_Throws() {
        //Create and set state on the object.
        //Call the method.
        //Assert the method threw.
    }
}

我在坦帕的TDD FireStarter中学到的一种方法是在基类中使用setup方法,然后在基类中使用名为observe的虚拟方法。然后在setup方法结束时在基类中调用该方法

然后,在从基类派生的新类中,您将重写observe方法。在这种情况下,诀窍是您希望执行基类的Setup方法,而子类没有Setup方法。原因是observe方法中的代码只是那些附加的东西您需要为child测试类创建一个测试


这种方法对我来说很有效,但有一个问题是,测试运行者希望执行基类测试,所以我要做的是将测试从基类移动到一个新类中,如果我有基类的话,这个新类派生自基类。

看起来您希望在任何测试开始之前运行一次设置,而不是在ea之前运行一次已运行ch测试。注释[SetUp]使该方法在运行夹具中的每个测试之前运行一次。[SetUp]未被继承

您要使用的注释是[TestFixtureSetUp],在运行某个装置中的任何测试之前,它只运行一次。这是以您期望的方式继承的。:)


看到

Partial Method了吗?因为安装程序是用and属性修饰的,我不确定会有太多的方法来完成。哦。没有想到Partial Method。有趣的方法。我不知道Partial Method是否会起作用。它们是私有的,不能被重写…@JPunyon-我想你是对的。我刚刚在一个派克。即使它们确实有效,我认为直接调用基本方法会更容易、更清晰。这就是我在问题中提到的“模板方法”模式。很高兴知道一些阵营推荐它。不。我希望在每次测试之前运行此设置。