【发布时间】:2014-05-03 11:53:03
【问题描述】:
问题
一旦测试完成,单元测试是否会通过垃圾收集(在我的情况下为System.IO.Stream)自动处理资源,或者是否有东西处于打开/使用状态,需要处理IDisposable 对象?
上下文/信息
我目前正在为使用 System.IO.Stream 的文件上传器进行单元测试。
我已经将HttpPostedFileBase 与由System.IO.MemoryStream 驱动的文件的InputStream 一起Moq 出,这一切都按预期工作。
我目前有(为简洁起见进行了更改):
[TestMethod]
public void TestUpload()
{
var stream = FunctionCreatingTheMemoryStream();
try
{
var file = new Mock<HttpPostedFileBase>();
file.Setup(f => f.FileName).Returns("test.txt");
file.Setup(f => f.InputStream).Returns(stream);
MethodThatUsesTheStream(file.Object)
// rest of test code with Assert
}
finally
{
stream.Dispose();
}
}
问题在于创建的MemoryStream 实例:
var stream = new FunctionCreatingTheMemoryStream();
是否值得将任何代码放在try catch 中,然后在finally 语句中处理流,或者作为单元测试,是否会自动处理内存流?
那么是否有必要这样做,或者它可以只是:
[TestMethod]
public void TestUpload()
{
var stream = FunctionCreatingTheMemoryStream();
var file = new Mock<HttpPostedFileBase>();
file.Setup(f => f.FileName).Returns("test.txt");
file.Setup(f => f.InputStream).Returns(stream);
MethodThatUsesTheStream(file.Object)
// rest of test code with Assert
}
【问题讨论】:
-
我很确定这个问题在这里有很多重复。如果您没有很好的理由不这样做,请始终在完成
IDisposable的对象上调用 Dispose。既然你在问这件事,我会说你没有充分的理由,所以就去做吧。 -
mocking 框架可能有一些魔力,但你自己做也没有坏处。而且我相信一般
Dispose和Close在流上是同义词,所以你只需要一个。然后我会使用using声明。 -
我没有看到你在这里测试的类 - 你只有内存流和模拟
-
我实际上找不到类似的问题@LasseV.Karlsen,因此我问了这个问题。如果您可以链接适当的问题,那么请这样做。我也问,因为我不想在我的测试中有不必要的代码。
-
@Chris 谢谢。我已经尝试过使用 using 语句来创建流,但它在返回时已关闭,所以我想我可以将它全部包装在一个闭包中,但我的情况与将所有内容包装在一个 try catch 中的情况类似。
标签: c# unit-testing moq mstest