犀牛模拟 ExpectationViolationException

Rhino-Mocking ExpectationViolationException

几天前我开始使用 Rhino-Mocks 和单元测试,所以我是新手。

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

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(真);预期 #0,实际 #1。

你能帮我找到缺失的步骤吗? :-)

你到底想在这里测试什么?

当您使用 using 语句时编译器生成正确的代码?似乎毫无意义。

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

或者您的处置程序正确处置了资源?这个测试不检查那个。您可以完全清空 Dispose(bool) 方法,您说要编写的测试仍然会通过。

最好在释放对象后检查 ObjB 是否为 null 以及应该在 dispose 方法中完成的任何其他事情。您要检查的是 处理对象时的行为 是否符合您的预期