3

我向自己提出的问题(现在是向整个世界,也许还有更远的地方),在我下面的评论中:

[TestMethod()]
public void SetMessageTypeSubcodeTest()
{
    int AMessageTypeSubcode;
    // Should I put this class instantiation in MyTestInitialize?
    MessageClass target = new MessageClass(); 
. . .

我应该这样做:

[TestInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...或这个:

[ClassInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...或者两者都不是?

并且由于 C#/.NET 是垃圾收集器,因此不需要在 TestCleanup() 或 ClassCleanup() 方法中释放 MessageClass,是吗?

4

3 回答 3

3

您需要为集合中的每个测试测试的全新类实例。这将防止任何可能的副作用(可能发生),并因此测试(应该是units,分开)相互影响。

于 2012-02-03T20:34:14.533 回答
2

除非类的构造很昂贵,否则每次测试都做。保证你有一个干净的石板。没错,您也不需要在测试结束时进行任何清理,除非您正在测试的特定事物需要它(数据库连接关闭、关闭 Web 协议的握手等)

于 2012-02-03T20:32:57.830 回答
1

这个问题没有真正的“正确”答案。就个人而言,鉴于您的代码,我不会将该类实例化放入任何类型的设置方法中。我会将其保留在每个测试中,以使测试更具可读性和完整性。

我相信使用 ClassInitialize 或 TestInitialize 方法的正确时间是当您想要为该类中的所有测试创建一个一致的环境时。这也是我不喜欢“每个系统类一个测试类”方法的原因。每个测试类都是一个固定装置,为其测试提供一致的环境。

过度激进地重构测试代码以将每个“new Foo()”移动到 TestFixture 中,这将导致非常好的分解,但难以阅读单元测试。对于测试,我认为可读性高于该级别的分解。

于 2012-03-25T18:00:49.237 回答