2017-03-15 37 views
2

我有一組單元測試,需要TestInitialize運行他們的工作...但是,有一個特定的測試,我希望能夠運行而不運行TestInitialize。有沒有辦法做到這一點?阻止TestInitialize運行一個TestMethod方法

這可能是這樣的:如果沒有

[TestClass] 
public class BingBangBoom 
{ 
    [TestInitialize] 
    public void Setup() 
    { 
     // ... 
    } 

    [TestMethod] 
    public void Bing() 
    { 
     // ... 
    } 

    [TestMethod] 
    public void Bang() 
    { 
     // ... 
    } 

    [TestMethod(PreventInitialize)] 
    public void Boom 
    { 
     // ... 
    } 
} 

不用擔心,我能想出的替代解決方案

編輯 - RE DavidG:

這似乎是一個恥辱,有這個:

[TestClass] 
public class BingBangBoom 
{ 
    [TestInitialize] 
    public void Setup() 
    { 
     // ... 
    } 

    // 10 very related methods 
} 

[TestClass] 
public class BingBangBoom2 
{ 
    // 1 method, even though it's entirely related to BingBangBoomin' 
} 

我想這是w它是的帽子。

+4

玩就把該測試另一個類? – DavidG

+0

謝謝 - @DavidG - 我添加了一個編輯。 – Jimmyt1988

回答

2

這並不明顯,但肯定是可行的。

假設你有屬性是這樣的:

public class SkipInitializeAttribute : Attribute { } 

你需要的是你的測試類中的公共財產被測試框架被注入的事情:

public TestContext TestContext { get; set; } 

然後就是分支你初始化像這:

[TestInitialize] 
public void Initialize() 
{ 
    bool skipInitialize = GetType().GetMethod(TestContext.TestName) 
     .GetCustomAttributes<SkipInitializeAttribute>().Any(); 

    if (!skipInitialize) 
    { 
     // Initialization code here 
    } 
} 

作爲自我測試解決方案的工作樣本:

using System; 
using System.Linq; 
using System.Reflection; 

using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace UnitTestProject1 
{ 
    public class SkipInitializeAttribute : Attribute 
    { 
    } 

    [TestClass] 
    public class UnitTest1 
    { 
     public TestContext TestContext { get; set; } 

     private bool IsInitializationDone { get; set; } 

     [TestInitialize] 
     public void Initialize() 
     { 
      bool skipInitialize = GetType().GetMethod(TestContext.TestName).GetCustomAttributes<SkipInitializeAttribute>().Any(); 

      if (!skipInitialize) 
      { 
       // Initialization code here 
       IsInitializationDone = true; 
      } 
     } 

     [TestMethod] 
     public void TestMethod1() 
     { 
      Assert.IsTrue(IsInitializationDone); 
     } 

     [TestMethod] 
     [SkipInitialize] 
     public void TestMethod2() 
     { 
      Assert.IsFalse(IsInitializationDone); 
     } 

     [TestMethod] 
     public void TestMethod3() 
     { 
      Assert.IsTrue(IsInitializationDone); 
     } 
    } 
} 

和結果:

Starting test execution, please wait... 
Passed TestMethod1 
Passed TestMethod2 
Passed TestMethod3 

Total tests: 3. Passed: 3. Failed: 0. Skipped: 0. 
Test Run Successful. 

銘記這一總體思路可以用基類/傭工等

+0

感謝您的自定義屬性方法:) Rad! – Jimmyt1988

相關問題