MsTest ClassInitialize和Inheritance

Raf*_*aeu 60 c# mstest

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

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

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

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

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

ClassInitialize永远不会被孩子所谓的测试...什么是真实的,正确的使用测试初始化与MSTest的继承方式?

cha*_*sos 37

遗憾的是,由于无法继承ClassInitializeAttribute类,因此无法实现此目的.

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

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

  • 我尝试了你的方法并且它有效,但老实说微软应该解决这个问题,因为NUnit没有这种行为. (27认同)
  • 哦,我刚刚注意到这些方法是“静态”的,这意味着它们不参与正常的继承。啊…… (2认同)
  • 仅供参考-[ClassInitialize / ClassCleanup继承目前正在为2.0.0开发](https://github.com/microsoft/testfx/issues/143)。 (2认同)

小智 13

ClassInitialize 和 ClassCleanup 属性有一个参数:

[ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)]
public static void ClassInitialize(TestContext context)
{
   // gets called once for each class derived from this class
   // on initialization
}

[ClassCleanup(InheritanceBehavior.BeforeEachDerivedClass)]
public static void Cleanup()
{
   // gets called once for each class derived from this class
   // on cleanup
}
Run Code Online (Sandbox Code Playgroud)

这实际上会做你想做的事。


Dav*_*ton 6

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

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyTests
{
  [TestClass]
  public sealed class TestAssemblyInitialize
  {
    [AssemblyInitialize]
    public static void Initialize(TestContext context)
    {
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)