代码之家  ›  专栏  ›  技术社区  ›  Mike

nunit不遵守属性继承

  •  11
  • Mike  · 技术社区  · 15 年前

    我对努尼特有意见——不知道有没有人有什么想法。

    我们使用的是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] 派生类中的方法。

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

    谢谢。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Mark Coleman    15 年前

    我没有问题。我用以下方法测试了结果:

    衍生测验

    [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));
        }
    }
    

    试验基地

    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 Beta和Nunit GUI v 2.5.3.9345(32位)测试输出。

    编辑 工作时,resharper 4.5中的测试运行程序工作不正常,但是在x86和x64中运行带有相应nunit.exe/nunit-86.exe的生成的测试项目产生了有效的输出。

        2
  •  1
  •   Mark Simpson    15 年前

    解决方法/不同的方法:

    不要依赖于不立即清晰的行为,而是这样做,而使用模板方法模式,使用正常语言特性使排序显式:

    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
        }
    }
    

    每当我有理由使用继承的设备或测试上下文时,这种方法就已经足够有效了。:)

    我依赖这些属性的问题是,由于这些类型是通过运行程序中的反射创建和调用的,方法之间没有任何关系,(没有多态性),所以很难解释它们的调用顺序。使用标准语言功能有助于简化这一点。

        3
  •  0
  •   Paul Sonier    15 年前

    您是否尝试给基类赋予[TestFixture]属性?我不知道这能解决问题,但似乎值得一试…其思想是,如果nunit不是一个测试设备,那么它可能会忽略基类上的属性。

        4
  •  0
  •   Russell Giddings    15 年前

    是的,我已经玩了半个小时了,这绝对是个错误。我已经尝试向所有类添加Testfixture,以及使用不同的组合。我还尝试了静态和实例方法。它似乎不想玩得很好!:

    不管怎样,我能找到的最好的解决方法是将TestFixtureSetup代码放入测试类和基类的构造函数中。至少这样,您就可以对继承有信心,而且对于您的代码的其他读者来说,更清楚的是,他们可能不知道nunit的内部工作原理:—)

        5
  •  0
  •   Simone    15 年前

    你用什么运行测试?您正在经历的行为与nunit(框架)无关,而与您正在使用的运行程序无关。您使用的是Resharper集成测试运行程序吗?