.net 如何为Dispose()的结果编写单元测试

.net 如何为Dispose()的结果编写单元测试,.net,unit-testing,idisposable,.net,Unit Testing,Idisposable,是否有一种测试IDisposable.Dispose()方法结果的好方法 谢谢您的回答。在调用.Dispose()方法后,确保所有函数和属性getter/setter返回ObjectDisposedException 要对Dispose方法进行单元测试,请调用Dispose,然后检查连接、会话和缓存的模拟版本。确保它们正确关闭和清除。我认为这取决于您在Dispose方法中尝试执行的操作。你能再解释一下Dispose方法中需要发生什么吗?你到底想测试什么?我有一个类承载一些资源,比如IConnec

是否有一种测试IDisposable.Dispose()方法结果的好方法


谢谢您的回答。

在调用
.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();
    }