.net 如何为Dispose()的结果编写单元测试
是否有一种测试IDisposable.Dispose()方法结果的好方法.net 如何为Dispose()的结果编写单元测试,.net,unit-testing,idisposable,.net,Unit Testing,Idisposable,是否有一种测试IDisposable.Dispose()方法结果的好方法 谢谢您的回答。在调用.Dispose()方法后,确保所有函数和属性getter/setter返回ObjectDisposedException 要对Dispose方法进行单元测试,请调用Dispose,然后检查连接、会话和缓存的模拟版本。确保它们正确关闭和清除。我认为这取决于您在Dispose方法中尝试执行的操作。你能再解释一下Dispose方法中需要发生什么吗?你到底想测试什么?我有一个类承载一些资源,比如IConnec
谢谢您的回答。在调用
.Dispose()
方法后,确保所有函数和属性getter/setter返回ObjectDisposedException
要对
Dispose
方法进行单元测试,请调用Dispose
,然后检查连接、会话和缓存的模拟版本。确保它们正确关闭和清除。我认为这取决于您在Dispose方法中尝试执行的操作。你能再解释一下Dispose方法中需要发生什么吗?你到底想测试什么?我有一个类承载一些资源,比如IConnection、ISession和cache(IDictionary)应该清理/关闭。老实说,我从来没有使用IDisposable
来包装实际需要释放的资源。我只使用它来利用使用
块在使用完对象后触发事件。另外,请不要只说某个代码模式很糟糕,即使是这样,也要提供一个原因或内容链接,说明原因。@Stephen Cleary:有些地方是合适的,但我建议你应该检查个人行为,看看有什么意义。尝试读取已释放的套接字连接应该失败,但尝试使已释放控件的一部分无效应该只是一个NOP。我希望有一个“TryBeginInvoke”用于将更新编组到控件的线程(如果控件在更新之前被释放,只需让更新作为NOP进行即可)。ObjectDisposedException的问题在于它引入了一个附加状态。它使代码膨胀,因为每个面向公共的属性和方法都必须显式地检查状态。这在线程安全类型中尤其复杂。对于所有这些增加的复杂性,它不会产生任何收益;没有足够的方法响应此异常,因为它表明代码中存在问题,而不是运行时错误。这种类型的检查在合同中做得更好。建立预期的行为就是验证它,而在现实中,声明这种行为是未定义的同样有用。“如果最终用户甚至不能遵守最基本的软件合同,他们无论如何也不会产生工作代码。”-没有关于IDisposble的一般性讨论。请坚持主题!
There are 2 sides to this question:
1:If there are any mocked objects which in the actual method are getting disposed
//In actual class properties be like
public Type SomeObj = new Type();
-----------------
//and in dispose() you are disposing it
public void Dispose()
{
SomeObj.Dispose();
}
now in test case you can do as follows:
[Fact]
public void Sometestmethod()
{
var myTestingClass= new TestingClass();
myTestingClass.Dispose();
Assert.Equal(null, myTestingClass.SomeObj);
}
2: If the obj getting disposed is a private obj
private SomeType SomeObj;
public TestingClassCtor(SomeType _someType)
{
SomeObj= _someObj;
}
--------
//in dispose method
public void Dispose()
{
SomeObj.Dispose();
}
Then to write Ut for this scenario
[Fact]
public void SomeTestMethod()
{
//This verifies that Dispose method in real class gets executed without any error.
myTestClass.Dispose();
}