我如何单元测试终结?单元测试

2023-09-04 01:44:19 作者:微笑ヽ诠释①切

我有以下的类,它是一个的IDisposable 对象装饰(我省略它添加的东西),这本身实现的IDisposable 使用一个共同的模式:

 公共类DisposableDecorator:IDisposable的
{
    私人只读了IDisposable _innerDisposable;

    公共DisposableDecorator(IDisposable接口innerDisposable)
    {
        _innerDisposable = innerDisposable;
    }

    #地区IDisposable的成员

    公共无效的Dispose()
    {
        处置(真);
        GC.Sup pressFinalize(本);
    }

    #endregion

    〜DisposableDecorator()
    {
        处置(假);
    }

    受保护的虚拟无效的Dispose(BOOL处置)
    {
        如果(处置)
            _innerDisposable.Dispose();
    }
}
 

我可以很容易地测试 innerDisposable 设置时,的Dispose()被称为:

  [测试]
公共无效Dispose__DisposesInnerDisposable()
{
    VAR mockInnerDisposable =新的模拟< IDisposable的>();

    新DisposableDecorator(mockInnerDisposable.Object).Dispose();

    mockInnerDisposable.Verify(X => x.Dispose());
}
 

但我怎么写一个测试,以确保 innerDisposable 并的没有的得到处理的终结?我想写这样的事情,但它失败,presumably因为终结还没有被调用的GC线程:

  [测试]
公共无效Finalizer__DoesNotDisposeInnerDisposable()
{
    VAR mockInnerDisposable =新的模拟< IDisposable的>();

    新DisposableDecorator(mockInnerDisposable.Object);
    所以GC.Collect();

    mockInnerDisposable.Verify(X => x.Dispose(),Times.Never());
}
 
第二单元 我们怎么看到物体 单元测试 含答案

解决方案

我可能是误会,但是:

  GC.WaitForPendingFinalizers();
 

可能做的伎俩 - http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx

I have the following class which is a decorator for an IDisposable object (I have omitted the stuff it adds) which itself implements IDisposable using a common pattern:

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();
    }
}

I can easily test that innerDisposable is disposed when Dispose() is called:

[Test]
public void Dispose__DisposesInnerDisposable()
{
    var mockInnerDisposable = new Mock<IDisposable>();

    new DisposableDecorator(mockInnerDisposable.Object).Dispose();

    mockInnerDisposable.Verify(x => x.Dispose());
}

But how do I write a test to make sure innerDisposable does not get disposed by the finalizer? I want to write something like this but it fails, presumably because the finalizer hasn't been called by the GC thread:

[Test]
public void Finalizer__DoesNotDisposeInnerDisposable()
{
    var mockInnerDisposable = new Mock<IDisposable>();

    new DisposableDecorator(mockInnerDisposable.Object);
    GC.Collect();

    mockInnerDisposable.Verify(x => x.Dispose(), Times.Never());
}

解决方案

I might be misunderstanding, but:

GC.WaitForPendingFinalizers();

Might do the trick - http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx