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
永远不会ClassInitialize
testing调用…在MsTest上inheritance使用testing初始化的真正和正确的方法是什么?
不幸的是,你不能这样做,因为ClassInitializeAttribute类不能被inheritance。
inheritance的属性可以被使用它的类的子类使用。 由于ClassInitializeAttribute
不能被inheritance,所以当MyTest
类被初始化时, ClassInitialize
类中的ClassInitialize
方法不能被调用。
试着用另一种方式解决它。 效率较低的方法是再次定义MyTest
的ClassInitialize
方法,只调用基本方法而不是复制代码。
一个潜在的解决方法是用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() { } }