我试图实现常见的扩展"快捷方式"检查模拟(Rhino)上是否未调用Dispose()
的方法:
public static void AssertNotDisposed<T>(this T disposable) where T : IDisposable =>
disposable.AssertWasNotCalled(x => x.Dispose());
但并不像我预期的那么简单。
var mock = MockRepository.GenerateMock<Stream>();
mock.Dispose();
mock.AssertNotDisposed();
AssertNotDisposed
调用不会注意mock.Dispose()
如果为派生类型进行了模拟而不是直接为IDisposable
。
如果我的方法参数完全是IDisposable
,我可以在某种程度上证明失败是正确的(看起来Rhino不仅仅区分模拟实例,而且甚至可以区分访问它们的类型)。
如果相同的假设对于泛型有效,那么动作(反射)构造动作和方法调用(不是通用的)可以帮助我不确定如何立即执行它。
那么问题的真正原因是什么?为什么AssertNotDisposed()
会忽略前面的Dispose()
?