Grokodile
Grokodile

Reputation: 3933

Why do I get an ExpectationViolationException when using a Stub?

This test using NUnit 2.5 and Rhino.Mocks 3.5:

[TestFixture]
public class ExcelWorksheetColumnTests
{
        private const string _name = "F1";
        private const int _index = 0;

        private MockRepository _repo;


        [SetUp]
        public void SetUp(){_repo = new MockRepository();}


        private ExcelWorksheetColumn CreateColumnUsingFixtureFieldsButWith(IExcelWorksheet excelWorksheet)
        {
            return new ExcelWorksheetColumn(_name, _index, excelWorksheet);
        }

        [Test]
        public void When_SelectedShootColumnType_Is_Changed_Raises_SelectedShootColumnTypeChanged_Event()
        {
            var stubWorksheet = _repo.Stub<IExcelWorksheet>();

            ExcelWorksheetColumn column =
                CreateColumnUsingFixtureFieldsButWith(stubWorksheet);

            stubWorksheet
               .Stub(p => p.GetSelectedShootColumnType(column))
               .Return(ShootColumnType.Generic);

            _repo.ReplayAll();

            bool itHappened = false;

            column.SelectedShootColumnTypeChanged 
                += (s, e) => { itHappened = true; };

            column.SelectedShootColumnType = ShootColumnType.SubjectId;

            Assert.That(itHappened);
        }

        [TearDown]
        public void TearDown()
        {
            _repo.ReplayAll();
            _repo.VerifyAll();
        }
}

Fails with this message:

Rhino.Mocks.Exceptions.ExpectationViolationException : IExcelWorksheet.SetSelectedShootColumnType( ClassPhotolink.Model.CreateSubjectList.ExcelWorksheetColumn, SubjectId);

Expected #0, Actual #1.

I thought Stubs were for returning values or ignoring method calls. Why is it trying to verify a call to

IExcelWorksheet.SetSelectedShootColumnType(
    IExcelWorksheetColumn column, 
    ShootColumnType type)

?

In the rhino mocks wiki it says with regards to the Stub extension method "Remember that by default Rhino Mocks will ignore unexpected methods calls."


Edits of Test.

Removing the SetUp & TearDown code, this still fails:

    [Test]
    public void When_SelectedShootColumnType_Is_Changed_Raises_SelectedShootColumnTypeChanged_Event()
    {
        var repo = new MockRepository();
        var stubWorksheet = repo.Stub<IExcelWorksheet>();

        ExcelWorksheetColumn column = CreateColumnUsingFixtureFieldsButWith(stubWorksheet);

        stubWorksheet
            .Stub(p => p.GetSelectedShootColumnType(column))
            .Return(ShootColumnType.Generic);

        repo.ReplayAll();

        bool itHappened = false;

        column.SelectedShootColumnTypeChanged += (s, e) => { itHappened = true; };

        column.SelectedShootColumnType = ShootColumnType.SubjectId;

        Assert.That(itHappened);
    }

but this works as I hoped.

    [Test]
    public void When_SelectedShootColumnType_Is_Changed_Raises_SelectedShootColumnTypeChanged_Event()
    {
        var stubWorksheet = MockRepository.GenerateStub<IExcelWorksheet>();

        ExcelWorksheetColumn column = CreateColumnUsingFixtureFieldsButWith(stubWorksheet);

        stubWorksheet
            .Stub(p => p.GetSelectedShootColumnType(column))
            .Return(ShootColumnType.Generic);

        bool itHappened = false;

        column.SelectedShootColumnTypeChanged += (s, e) => { itHappened = true; };

        column.SelectedShootColumnType = ShootColumnType.SubjectId;

        Assert.That(itHappened);
    }

So it seems to have something to do with repo.Stub() versus MockRepository.GenerateStub();

Upvotes: 0

Views: 2223

Answers (1)

Jay
Jay

Reputation: 57919

Using Stub() means that you do expect the method call. Unexpected calls are calls to methods on which no expectation has been set.

update

I'm wondering now if the problem is with your use of setup, teardown, and record/replay, which are unnecessary.

What happens if you write the test this way:

[TestFixture]
public class ExcelWorksheetColumnTests
{
        private const string _name = "F1";
        private const int _index = 0;

        private ExcelWorksheetColumn CreateColumnUsingFixtureFieldsButWith(IExcelWorksheet excelWorksheet)
        {
            return new ExcelWorksheetColumn(_name, _index, excelWorksheet);
        }

        [Test]
        public void When_SelectedShootColumnType_Is_Changed_Raises_SelectedShootColumnTypeChanged_Event()
        {
            var stubWorksheet = MockRepository.Stub<IExcelWorksheet>();

            ExcelWorksheetColumn column =
                CreateColumnUsingFixtureFieldsButWith(stubWorksheet);

            stubWorksheet
               .Stub(p => p.GetSelectedShootColumnType(column))
               .Return(ShootColumnType.Generic);

            bool itHappened = false;

            column.SelectedShootColumnTypeChanged 
                += (s, e) => { itHappened = true; };

            column.SelectedShootColumnType = ShootColumnType.SubjectId;

            Assert.That(itHappened);
        }
}

Upvotes: 3

Related Questions