79

我的测试有一个基类,它由以下方式组成:

[TestClass]
public abstract class MyBaseTest
{
   protected static string myField = "";

   [ClassInitialize]
   public static void ClassInitialize(TestContext context)
   {
       // static field initialization
       myField = "new value";
   }
}

现在我正在尝试创建一个从基础继承的新测试,具有以下签名:

[TestClass]
public class MyTest : MyBaseTest
{
   [TestMethod]
   public void BaseMethod_ShouldHave_FieldInitialized()
   {
       Assert.IsTrue(myField == "new value");
   }
}

ClassInitialize子测试从不调用...在MsTest上使用带有继承的测试初始化​​的真正正确方法是什么?

4

4 回答 4

50

不幸的是,您无法以这种方式实现此目的,因为ClassInitializeAttribute 类不能被继承。

继承的属性可以被使用它的类的子类使用。由于ClassInitializeAttribute不能被继承,当MyTest类被初始化时,不能调用类中的ClassInitialize方法。MyBaseTest

尝试用另一种方式解决它。一种效率较低的方法是再次定义ClassInitialize方法MyTest并仅调用基本方法而不是复制代码。

于 2013-04-11T10:12:18.597 回答
10

一个潜在的解决方法是定义一个新类AssemblyInitializeAttribute。显然,它有不同的范围,但对我来说,它满足了我的需求(横切关注点,恰好需要对每个测试类和测试方法进行完全相同的设置。)

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyTests
{
  [TestClass]
  public sealed class TestAssemblyInitialize
  {
    [AssemblyInitialize]
    public static void Initialize(TestContext context)
    {
      ...
    }
  }
}
于 2016-06-18T17:22:30.747 回答
1

在基类上使用静态构造函数?按照设计,它只执行一次,并且没有像 ClassInitializeAttribute 这样的奇怪的继承限制。

于 2019-06-17T15:06:59.010 回答
0

更新:添加锁以避免多线程问题...

我们知道,当类运行时,会为类中的每个 [TestMethod] 构造一个新实例。每次发生这种情况时,都会调用基类的无参数构造函数。您不能简单地在基类中创建一个静态变量并在构造函数运行时对其进行测试吗?

这有助于您不要忘记将初始化代码放在子类中。

不确定这种方法是否有任何缺点......

像这样:

public class TestBase
{
    private static bool _isInitialized = false;
    private object _locker = new object();

    public TestBase()
    {
        lock (_locker) 
        {
          if (!_isInitialized)
          {
            TestClassInitialize();
            _isInitialized = true;
          }
        }
    }

    public void TestClassInitialize()
    {
        // Do one-time init stuff
    }
}
public class SalesOrderTotals_Test : TestBase
{
    [TestMethod]
    public void TotalsCalulateWhenThereIsNoSalesTax()
    {
    }
    [TestMethod]
    public void TotalsCalulateWhenThereIsSalesTax()
    {
    }
}
于 2015-01-22T15:19:40.843 回答