2017-03-13 7 views
0

Nunit(2.6.4)用のTestDecorator Addinを作成しようとしています。 しかし、アドインを有効にすると、デコレータ自体は何もしない場合でも、装飾テストのセットアップとティアダウンを実行できなくなります(下の図のようにすべての呼び出しを実際のテストに延期します)。TestDecorator Addinを使用しているときにNunit SetUpとTearDownが実行されない

なぜこれでSetUp/TearDownが実行されないのでしょうか?

デコレータ:

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 
+0

はもっとありますか?あなたはそれをインストールするアドインコードではなく、テスト自体を置き換えるクラスだけを掲示しました。 – Charlie

+0

編集:インストールコードとサンプルテストを追加 – Murray

答えて

0

TestMethod.Run(...)はTest.Parentプロパティセットを持つに依存します。プロパティは(間違って)仮想ではないので、デコレータによって委譲することはできません。次のように回避策として、具体的なクラスのParentプロパティは、装飾されたRunメソッドで

を設定することができます。

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