Tôi đã lớp sau đó là một trang trí cho một đối tượng IDisposable
(Tôi đã bỏ qua những thứ nó bổ sung thêm) mà bản thân thực hiện IDisposable
sử dụng một mô hình phổ biến:Làm cách nào để kiểm tra đơn vị trình hoàn thành?
public class DisposableDecorator : IDisposable
{
private readonly IDisposable _innerDisposable;
public DisposableDecorator(IDisposable innerDisposable)
{
_innerDisposable = innerDisposable;
}
#region IDisposable Members
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
~DisposableDecorator()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
_innerDisposable.Dispose();
}
}
tôi có thể dễ dàng kiểm tra rằng innerDisposable
được xử lý khi Dispose()
được gọi là:
[Test]
public void Dispose__DisposesInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object).Dispose();
mockInnerDisposable.Verify(x => x.Dispose());
}
Nhưng làm thế nào để viết một bài kiểm tra để đảm bảo innerDisposable
không không được xử lý theo finalizer? Tôi muốn viết một cái gì đó như thế này nhưng nó không thành công, có lẽ vì finalizer chưa được gọi bằng sợi GC:
[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
var mockInnerDisposable = new Mock<IDisposable>();
new DisposableDecorator(mockInnerDisposable.Object);
GC.Collect();
mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}
[Here] (http://stackoverflow.com/questions/3259456/should-dispose-methods-be-unit-tested) bạn có thể thấy việc sử dụng IDisposable. Điều đó làm việc tốt cho tôi. –