阻止TestInitialize运行一个TestMethod方法

Jim*_*988 5 c# attributes unit-testing

我有一套单元测试需要TestInitialize运行才能运行...但是,有一个特定的测试,我希望能够在不运行的情况下运行TestInitialize.有没有办法做到这一点?

它可能看起来像这样:

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

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

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

    [TestMethod(PreventInitialize)]
    public void Boom
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

不用担心,如果没有,我可以提出替代解决方案

编辑 - 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'
}
Run Code Online (Sandbox Code Playgroud)

我想这就是它.

Lan*_*kin 8

这不是很明显,但肯定是可行的.

假设你有这样的属性:

public class SkipInitializeAttribute : Attribute { }
Run Code Online (Sandbox Code Playgroud)

您需要的是测试类中的公共属性,以便通过测试框架注入:

public TestContext TestContext { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后像这样分支你的初始化:

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

    if (!skipInitialize)
    {
        // Initialization code here
    }
}
Run Code Online (Sandbox Code Playgroud)

工作样本作为自我测试的解决方案:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

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

Total tests: 3. Passed: 3. Failed: 0. Skipped: 0.
Test Run Successful.
Run Code Online (Sandbox Code Playgroud)

记住这个一般的想法,你可以玩基类/助手等.