2010-02-23 62 views
11

我有NUnit的问题 - 想知道是否有人有任何想法。NUnit不服从属性继承

我们使用的是NUnit 2.5.3.9345和C#3.5。

看看下面的代码:

public class UnitTestBase 
{ 
    [TestFixtureSetUp] 
    public void SetUpTestFixture() 
    { 
     //Do something in base 
    } 
} 

[TestFixture] 
public class SomeTestClass : UnitTestBase 
{ 
    [TestFixtureSetUp] 
    public void FixtureSetUp() 
    { 
     //Do something in test class 
    } 

    [Test] 
    public void SomeTest() 
    { 
     //Some assertion 
    } 
} 

按照documentation,如果我跑SomeTestClass.SomeTest()UnitTestBase.SetUpTestFixture()应该SomeTestClass.FixtureSetUp()之前被调用。

情况并非如此 - 只有在派生类中没有提供[TestFixtureSetUp]方法时才会调用基方法。

有什么想法吗?我真的很困惑!

谢谢。

+1

这也在nunit邮件列表中讨论过:http://groups.google.com/group/nunit-discuss/browse_thread/thread/be59e1152773a456 –

回答

2

我没有问题。我测试了以下成果:

得出的试验

[TestFixture] 
public class DerivedTest : TestBase 
{ 

    [TestFixtureSetUp] 
    public void FixtureSetup() 
    { 

     File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From DerivedTest{0}", Environment.NewLine)); 
    } 

    [TestFixtureTearDown] 
    public void FixtureTearDown() 
    { 
     File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown Down From DerivedTest{0}", Environment.NewLine)); 
    } 

    [SetUp] 
    public void Setup() 
    { 
     File.AppendAllText("Out.txt", string.Format("Setup From DerivedTest{0}", Environment.NewLine)); 
    } 
    [TearDown] 
    public void Down() 
    { 
     File.AppendAllText("Out.txt", string.Format("TearDown From DerivedTest{0}", Environment.NewLine)); 
    } 

    [Test] 
    public void DoATest() 
    { 
     File.AppendAllText("Out.txt", string.Format("Did a Test{0}", Environment.NewLine)); 
    } 
} 

TestBase

public class TestBase 
{ 

    [TestFixtureSetUp] 
    public void BaseTestFixtureSetUp() 
    { 
     File.AppendAllText("Out.txt", string.Format("TestFixtureSetUp From TestBase{0}", Environment.NewLine)); 
    } 

    [TestFixtureTearDown] 
    public void BaseTestFixtureTearDown() 
    { 
     File.AppendAllText("Out.txt", string.Format("TestFixtureTearDown From TestBase{0}", Environment.NewLine)); 
    } 

    [SetUp] 
    public void BaseSetup() 
    { 
     File.AppendAllText("Out.txt", string.Format("Setup From TestBase{0}", Environment.NewLine)); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     File.AppendAllText("Out.txt", string.Format("TearDown From TestBase{0}", Environment.NewLine)); 
    } 
} 

这将产生以下的输出:

TestFixtureSetUp From TestBase 
TestFixtureSetUp From DerivedTest 
Setup From TestBase 
Setup From DerivedTest 
Did a Test 
TearDown From DerivedTest 
TearDown From TestBase 
TestFixtureTearDown Down From DerivedTest 
TestFixtureTearDown From TestBase 

我能测试输出与ReSharper 5测试版和Nunit GUI v 2.5.3。9345(32位)

编辑 ,而在工作中ReSharper的4.5测试运行没有正常工作,但是在运行x86和x64与相应NUnit.exe/NUnit的-86.exe内置测试项目产生有效的输出。

+0

您是否使用过ReSharper 5? – Michael

+0

是的,我在家里使用测试版5。 –

+0

将此标记为答案 - 看起来像ReSharper和TeamCity问题 - 要求我们的ReSharper(一次发布5次)和TeamCity NUnit插件更新,以便我可以充分利用此功能。 – Michael

0

你有没有试过给基类[TestFixture]属性?我不知道那会修复它,但似乎可能值得一试......想法是,如果NUnit不是TestFixture,它可能会忽略基类上的属性。

+0

是的,我们在基类中没有[TestFixture]的行为是一样的。 如果我将[TestFixtureSetUp]属性关闭派生类方法,则调用基础。 – Michael

0

是的,我一直在玩这个过去的半小时,这绝对是一个错误。我已经尝试将TestFixture添加到所有类以及具有不同的组合。我也尝试过静态和实例方法。它似乎不想打得很好! :-(

无论如何,我能找到的最好的解决方法是将TestFixtureSetUp代码放入测试类和基类的构造函数中,至少可以对继承性有信心,并且对其他读者你的代码也许谁也不知道NUnit的内部工作:-)

+0

顺便说一下,我试过它对NUnit v2.5.0.9122,它不适用于这个版本,所以这不是最近引入的东西。 –

+0

在NUnit Windows App中尝试了它并使用了Resharper运行器,但都没有工作。 :-( –

+0

我刚刚从Marks回答了确切的代码,它只输出了派生类的测试输出,没有任何东西来自基类。我现在开始用吸管来抓住它,但是我刚刚注意到他正在运行32- bit。我正在运行64位,这可能是导致不同结果的差异吗? –

1

做这件事的解决方法/不同的方式:

不是依靠行为不立即清除,做这样的事情,而不是使用模板方法模式使用正常语言特征来明确排序:

public class UnitTestBase 
{ 
    protected abstract void PerFixtureSetUp(); 

    [TestFixtureSetUp] 
    public void SetUpTestFixture() 
    { 
     PerFixtureSetUp(); 
    } 
} 

[TestFixture] 
public class SomeTestClass : UnitTestBase 
{ 
    protected override void PerFixtureSetUp() 
    { 

    } 

    [Test] 
    public void SomeTest() 
    { 
     //Some assertion 
    } 
} 

任何时候我有理由使用继承的fixtures或测试上下文,这种方式已经运行得很好。 :)

我依靠这些属性的问题是,因为这些类型是通过在runner中反射来创建和调用的,方法之间没有关系(没有多态性),所以很难推断它们的顺序调用。使用标准语言功能有助于简化这一点。

+0

我认为这是处理这种情况的好方法 - 我只是非常喜欢使用NUnit的内置功能 排序isn没有太多的问题,只要我只在基础中定义一种方法,在派生类中定义一种方法 - 这样就可以保证排序(没有提供任何例外s在安装/拆卸过程中被丢弃) – Michael

0

你在做什么测试?您遇到的行为与NUnit(框架)无关,而与您正在使用的跑步者相关。你使用的是Resharper集成测试器吗?

+0

我已经尝试了NUnit GUI和Resharper跑步者,获得了相同的结果。 –

+0

如果你把一个TestFixtureTearDown放在基类或者派生类或者两者上,是否会改变任何东西? – Simone

+0

似乎使用NUnit 2.5.3图形用户界面可以工作,而ReSharper 5 beta 2可以工作。 ReSharper 4.5.1似乎是问题,与我们的TeamCity(5.0.10669)版本一起, – Michael