我有一个测试的基类,它由以下方式组成:
[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
,只调用基本方法而不是复制代码.
小智 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)
这实际上会做你想做的事。
一个潜在的解决方法是改为定义一个新类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)
归档时间: |
|
查看次数: |
25862 次 |
最近记录: |