使用TestDecorator加载项时不运行Nunit安装和拆卸

使用TestDecorator加载项时不运行Nunit安装和拆卸,nunit,Nunit,我正试图为Nunit(2.6.4)编写一个TestDecorator插件。 但是启用加载项会阻止任何修饰测试的安装和拆卸运行,即使修饰程序本身什么都不做(将所有调用延迟到实际测试,如下所示) 你知道为什么这会阻止安装/拆卸运行吗 装饰师: public class DoNothingTestDecorator : Test { private readonly Test concrete; public DoNothingTestDecorator(Test concrete)

我正试图为Nunit(2.6.4)编写一个TestDecorator插件。 但是启用加载项会阻止任何修饰测试的安装和拆卸运行,即使修饰程序本身什么都不做(将所有调用延迟到实际测试,如下所示)

你知道为什么这会阻止安装/拆卸运行吗

装饰师:

public class DoNothingTestDecorator : Test
{
    private readonly Test concrete;

    public DoNothingTestDecorator(Test concrete) : base(concrete.TestName)
    {
        this.concrete = concrete;
    }

    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        return concrete.Run(listener, filter);
    }

    public override string TestType
    {
        get { return concrete.TestType; }
    }

    public override object Fixture
    {
        get { return concrete.Fixture; }
        set { concrete.Fixture = value; }
    }

    public override int CountTestCases(ITestFilter filter)
    {
        return concrete.CountTestCases(filter);
    }

    public override Type FixtureType
    {
        get { return concrete.FixtureType; }
    }

    public override bool Equals(object obj)
    {
        return concrete.Equals(obj);
    }

    public override int GetHashCode()
    {
        return concrete.GetHashCode();
    }

    public override bool IsSuite
    {
        get { return concrete.IsSuite; }
    }

    public override string MethodName
    {
        get { return concrete.MethodName; }
    }

    public override int TestCount
    {
        get { return concrete.TestCount; }
    }

    public override IList Tests
    {
        get { return concrete.Tests; }
    }

    public override string ToString()
    {
        return concrete.ToString();
    }
}
[NUnitAddin(
    Type=ExtensionType.Core,
    Name = "TestDecoratorAddin",
    Description="Attempts to decorate a test without changing its behavior")
]
public class TestDecoratorAddin : ITestDecorator, IAddin
{
    public bool Install(IExtensionHost host)
    {
        IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );
        if (testDecorators == null)
            return false;

        testDecorators.Install(this);
        return true;
    }

    public Test Decorate(Test test, MemberInfo member)
    {
        if (test.Properties.Contains("DecorateMe"))
            return new DoNothingTestDecorator(test);
        return test;
    }
}
[TestFixture]
public class TestToBeDecorated
{
    private bool setupRan = false;

    [SetUp]
    public void SetUp()
    {
        setupRan = true;
    }

    [TearDown]
    public void TearDown()
    {
        setupRan = false;
    }


    [Test]
    [Property("DecorateMe",1)]
    public void TestDecorated() // Fails
    {
        Assert.That(setupRan);
    }

    [Test]
    [Property("Nothing",1)]
    public void TestUnDecorated()  // Passes 
    {
        Assert.That(setupRan);
    }
}
附件:

public class DoNothingTestDecorator : Test
{
    private readonly Test concrete;

    public DoNothingTestDecorator(Test concrete) : base(concrete.TestName)
    {
        this.concrete = concrete;
    }

    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        return concrete.Run(listener, filter);
    }

    public override string TestType
    {
        get { return concrete.TestType; }
    }

    public override object Fixture
    {
        get { return concrete.Fixture; }
        set { concrete.Fixture = value; }
    }

    public override int CountTestCases(ITestFilter filter)
    {
        return concrete.CountTestCases(filter);
    }

    public override Type FixtureType
    {
        get { return concrete.FixtureType; }
    }

    public override bool Equals(object obj)
    {
        return concrete.Equals(obj);
    }

    public override int GetHashCode()
    {
        return concrete.GetHashCode();
    }

    public override bool IsSuite
    {
        get { return concrete.IsSuite; }
    }

    public override string MethodName
    {
        get { return concrete.MethodName; }
    }

    public override int TestCount
    {
        get { return concrete.TestCount; }
    }

    public override IList Tests
    {
        get { return concrete.Tests; }
    }

    public override string ToString()
    {
        return concrete.ToString();
    }
}
[NUnitAddin(
    Type=ExtensionType.Core,
    Name = "TestDecoratorAddin",
    Description="Attempts to decorate a test without changing its behavior")
]
public class TestDecoratorAddin : ITestDecorator, IAddin
{
    public bool Install(IExtensionHost host)
    {
        IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );
        if (testDecorators == null)
            return false;

        testDecorators.Install(this);
        return true;
    }

    public Test Decorate(Test test, MemberInfo member)
    {
        if (test.Properties.Contains("DecorateMe"))
            return new DoNothingTestDecorator(test);
        return test;
    }
}
[TestFixture]
public class TestToBeDecorated
{
    private bool setupRan = false;

    [SetUp]
    public void SetUp()
    {
        setupRan = true;
    }

    [TearDown]
    public void TearDown()
    {
        setupRan = false;
    }


    [Test]
    [Property("DecorateMe",1)]
    public void TestDecorated() // Fails
    {
        Assert.That(setupRan);
    }

    [Test]
    [Property("Nothing",1)]
    public void TestUnDecorated()  // Passes 
    {
        Assert.That(setupRan);
    }
}
测试:

public class DoNothingTestDecorator : Test
{
    private readonly Test concrete;

    public DoNothingTestDecorator(Test concrete) : base(concrete.TestName)
    {
        this.concrete = concrete;
    }

    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        return concrete.Run(listener, filter);
    }

    public override string TestType
    {
        get { return concrete.TestType; }
    }

    public override object Fixture
    {
        get { return concrete.Fixture; }
        set { concrete.Fixture = value; }
    }

    public override int CountTestCases(ITestFilter filter)
    {
        return concrete.CountTestCases(filter);
    }

    public override Type FixtureType
    {
        get { return concrete.FixtureType; }
    }

    public override bool Equals(object obj)
    {
        return concrete.Equals(obj);
    }

    public override int GetHashCode()
    {
        return concrete.GetHashCode();
    }

    public override bool IsSuite
    {
        get { return concrete.IsSuite; }
    }

    public override string MethodName
    {
        get { return concrete.MethodName; }
    }

    public override int TestCount
    {
        get { return concrete.TestCount; }
    }

    public override IList Tests
    {
        get { return concrete.Tests; }
    }

    public override string ToString()
    {
        return concrete.ToString();
    }
}
[NUnitAddin(
    Type=ExtensionType.Core,
    Name = "TestDecoratorAddin",
    Description="Attempts to decorate a test without changing its behavior")
]
public class TestDecoratorAddin : ITestDecorator, IAddin
{
    public bool Install(IExtensionHost host)
    {
        IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );
        if (testDecorators == null)
            return false;

        testDecorators.Install(this);
        return true;
    }

    public Test Decorate(Test test, MemberInfo member)
    {
        if (test.Properties.Contains("DecorateMe"))
            return new DoNothingTestDecorator(test);
        return test;
    }
}
[TestFixture]
public class TestToBeDecorated
{
    private bool setupRan = false;

    [SetUp]
    public void SetUp()
    {
        setupRan = true;
    }

    [TearDown]
    public void TearDown()
    {
        setupRan = false;
    }


    [Test]
    [Property("DecorateMe",1)]
    public void TestDecorated() // Fails
    {
        Assert.That(setupRan);
    }

    [Test]
    [Property("Nothing",1)]
    public void TestUnDecorated()  // Passes 
    {
        Assert.That(setupRan);
    }
}
Nunit输出

>nunit-console ExampleTests.dll
NUnit-Console version 2.6.4.14350
Copyright (C) 2002-2012 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.

Runtime Environment -
   OS Version: Microsoft Windows NT 6.2.9200.0
  CLR Version: 2.0.50727.8009 ( Net 3.5 )

ProcessModel: Default    DomainUsage: Single
Execution Runtime: net-3.5
.F.
Tests run: 2, Errors: 0, Failures: 1, Inconclusive: 0, Time: 0.0489326845238935 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

Errors and Failures:
1) Test Failure : ExampleTests.TestToBeDecorated.TestDecorated
     Expected: True
  But was:  False
TestMethod.Run(…)取决于是否设置了Test.Parent属性。该属性(错误地?)是非虚拟的,因此不能由装饰者委派

作为一种解决方法,可以在修饰的运行方法中设置混凝土类的父属性,如下所示:

public class DoNothingTestDecorator : Test
{
/*...*/
    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        concrete.Parent=this.Parent;
        return concrete.Run(listener, filter);
    }
/*..*/
}

还有吗?您只发布了替换测试本身的类,而不是安装它的加载项代码。编辑:添加了安装代码和示例测试