MsTest ClassInitialize和inheritance

我有一个testing的基类,它由以下几个方面组成:

[TestClass] public abstract class MyBaseTest { protected static string myField = ""; [ClassInitialize] public static void ClassInitialize(TestContext context) { // static field initialization myField = "new value"; } } 

现在我试图创build一个新的testing,从基地inheritance,具有以下签名:

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

ClassInitialize永远不会ClassInitializetesting调用…在MsTest上inheritance使用testing初始化​​的真正和正确的方法是什么?

不幸的是,你不能这样做,因为ClassInitializeAttribute类不能被inheritance。

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

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

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

 using Microsoft.VisualStudio.TestTools.UnitTesting; namespace MyTests { [TestClass] public sealed class TestAssemblyInitialize { [AssemblyInitialize] public static void Initialize(TestContext context) { ... } } } 

我们知道,类的每一个[TestMethod]在运行时都会构造一个新的类实例。 每次发生这种情况时,都会调用基类的无参数构造函数。 难道你不能简单地在基类中创build一个静态variables,并在构造函数运行时testing它吗?

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

不知道这种方法是否有任何缺点…

像这样:

 public class TestBase { private static bool _isInitialized = false; public TestBase() { 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() { } }