如何处理MSTest中的IDisposable fixture成员?

4

我有一个测试类,在其中有一些IDisposable项。这是我第一次尝试做这样的事情:

private MemoryStream toolExampleMs;
private MemoryStream issueClassExampleMs;
private MemoryStream issueTypeExampleMs;
private MemoryStream uniqueIdExampleMs;

private Check exampleCheck;

public SuppressionDatabaseTest()
{
    this.toolExampleMs = new MemoryStream(Encoding.UTF8.GetBytes(toolExample));
    this.issueClassExampleMs = new MemoryStream(Encoding.UTF8.GetBytes(toolExample));
    this.issueTypeExampleMs = new MemoryStream(Encoding.UTF8.GetBytes(issueTypeExample));
    this.uniqueIdExampleMs = new MemoryStream(Encoding.UTF8.GetBytes(uniqueIdExample));

    this.exampleCheck = new Check();
    this.exampleCheck.IssueClass = "FooBarClass";
    this.exampleCheck.IssueType = "FooBarType";
    this.exampleCheck.Key = "FooBarExactWith?Unicode";
}

[ClassCleanup]
public void CleanupAll() // Error: CleanupAll has the wrong signature
{
    toolExampleMs.Dispose();
    issueClassExampleMs.Dispose();
    issueTypeExampleMs.Dispose();
    uniqueIdExampleMs.Dispose();
}

[TestCleanup]
public void Cleanup()
{
    this.toolExampleMs.Seek(0, SeekOrigin.Begin);
    this.issueClassExampleMs.Seek(0, SeekOrigin.Begin);
    this.issueTypeExampleMs.Seek(0, SeekOrigin.Begin);
    this.uniqueIdExampleMs.Seek(0, SeekOrigin.Begin);
}

很不幸,在MSTest中,ClassCleanup方法必须是static的,这意味着没有地方可以挂接dispose的调用。这是否意味着我需要在每个单独的测试之前和之后重构这些流?


你不想这样做吗?流不应该用于存储或在测试之间传递信息;无论每个测试或所有测试需要什么设置和拆卸,测试都应该是理论上独立的。它们实际运行的顺序,无论是按字母顺序、定义顺序还是完全随机,都不应该有任何影响,也不应该有任何测试依赖于另一个测试成功的情况。 - KeithS
@KeithS:这些测试不会修改流。只是看起来有点浪费。 - Billy ONeal
1个回答

4

简短的回答是肯定的。在每次测试之前重构这些流,并在每次测试后将它们处理掉。通过使用[TestCleanup]和[TestInitialize]特性,这很容易实现。

因此,不要在测试类SuppressionDatabaseTest中构建您的流,而应该使用[TestInitialize]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接