lundi 27 avril 2015

AssertWasCalled passes on unused variable

While refactoring unit tests in a project, I found some tests that should have been failing but were succeeding for some mysterious reason. After removing irrelevant code and moving everything into one method, the following minimal example still has the original behavior:

[Test]
public void TestThatShouldFail()
{
    // Arrange
    var mock = MockRepository.GenerateStub<ISomething>();
    mock.Stub(wi => wi.SomeProperty).Return(MockRepository.GenerateStub<ISomeProperty>());
    mock.SomeProperty.Stub(t => t.SomethingElse).Return(new SomethingElse());
    ...

    // Act      
    _foo.Foo();

    // Assert
    mock.AssertWasCalled(wi => wi.SomeProperty.DoSomething());
}

The variable mock is never passed, exposed or exported in any way which is available to the code running in the Act part. Still, the test passes, which should mean that the DoSomething method was called on the SomeProperty of the mock variable, which is obviously wrong.

How can this happen?

Aucun commentaire:

Enregistrer un commentaire