Rhino-Mocking ExpectationViolationException

时间:2015-01-05 12:50:26

标签: c# unit-testing mocking rhino-mocks

几天前我开始使用Rhino-Mocks和Unit-Tests,所以我是新手。

我创建了一个像这样的一次性类:

public class SomeClass : IDisposable
{
    private bool _disposed;

    public SomeOtherClass ObjB { get; private set; }

    public SomeClass(SomeOtherClass b)
    {
        ObjB = b;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        if (disposing)
        {
            // set all properties to null

            ObjB = null;
            // ...
        }

        _disposed = true;
    }
}

以及应检查处理是否正确完成的单元测试:

[TestFixture]
public class SomeClassTests
{
    [Test]
    public void ShouldDisposeCorrectly()
    {
        var classB = MockRepository.GenerateStrictMock<SomeOtherClass>()
        SomeClass smth;

        using (smth = MockRepository.GenerateStrictMock<SomeClass>(classB))
        { }

        smth.Expect(p => p.ObjB).Should().BeNull();
    }
}

现在,当我开始测试时,它会抛出以下错误: Rhino.Mocks.Exceptions.ExpectationViolationException:SomeClass.Dispose(True);预期#0,实际#1。

你能帮我找到失踪的一步吗? : - )

1 个答案:

答案 0 :(得分:1)

你真的想在这里测试什么?

当您使用using语句时,编译器会生成正确的代码吗?似乎相当无趣。

或者你的类实现了IDisposable?你可以通过更简单的测试来做到这一点。

或者您的处理程序是否正确处理了资源?此测试不检查。你可以完全清空Dispose(bool)方法,你说你想写的测试仍然会通过。

最好在对象被处置后检查ObjBnull,以及在dispose方法中应该做的任何其他事情。你想要检查的是你处置对象时的行为是你期望的