Проблемы с простой насмешкой с использованием RhinoMocks .NET - PullRequest
3 голосов
/ 05 февраля 2010

Я пытаюсь поэкспериментировать с RhinoMocks, где я должен сказать, что я новичок и, вероятно, я не вижу здесь ничего очевидного. То, что я делаю, выглядит примерно так:

    [TestMethod]
    public void SaveResponsibleUserFromChangeset()
    {
        var action = mocks.StrictMock<GenomeAction>();
        var changeset = new ActionChangeset();

        changeset.ResponsibleUser = new ChangeableProperty<UserIdentity>("Administrator") {IsChanged = true};
        changeset.MarkAll(true);

        using(mocks.Record())
        {
            Expect.Call(action.ResponsibleUser).SetPropertyAndIgnoreArgument();
        }

        using(mocks.Playback())
        {
            var persistor = new ActionPersistor(new MockIdentityResolver());
            persistor.SaveActionChanges(changeset, action);
        }

        action.VerifyAllExpectations();
    }

    private class MockIdentityResolver : IIdentityResolver
    {
        public GenomeUser GetUser(UserIdentity identity)
        {
            var user = mocks.DynamicMock<GenomeUser>();
            user.Username = identity.Username;
            return user;
        }
    }

Цель состоит в том, чтобы иметь очень простой тест, который проверяет, устанавливает ли метод SaveActionChanges свойство ResponsibleUser. Как часть этого, это должно разрешить идентификацию пользователя, используя распознаватель, для которого я предоставил фиктивную реализацию. К сожалению, кажется, я не могу просто вернуть еще один макет в режиме воспроизведения, потому что он говорит (на закрывающей скобке второго использования), что Действие недействительно, когда объект (типа GenomeUser) находится в записи состояние .

Есть идеи, что вызывает проблему и как ее преодолеть?

1 Ответ

4 голосов
/ 05 февраля 2010

Я думаю, вам нужно создать new MockIdentityResolver() вне mocks.Playback().

[TestMethod]
public void SaveResponsibleUserFromChangeset()
{
    var action = mocks.StrictMock<GenomeAction>();
    var changeset = new ActionChangeset();
    var identityResolver;
    changeset.ResponsibleUser = new ChangeableProperty<UserIdentity>("Administrator") {IsChanged = true};
    changeset.MarkAll(true);

    using(mocks.Record())
    {
        Expect.Call(action.ResponsibleUser).SetPropertyAndIgnoreArgument();
        identityResolver = new MockIdentityResolver()
    }

    using(mocks.Playback())
    {
        var persistor = new ActionPersistor(identityResolver);
        persistor.SaveActionChanges(changeset, action);
    }

    action.VerifyAllExpectations();
}

private class MockIdentityResolver : IIdentityResolver
{
    public GenomeUser GetUser(UserIdentity identity)
    {
        var user = mocks.DynamicMock<GenomeUser>();
        user.Username = identity.Username;
        return user;
    }
}

вы должны взглянуть на использование AAA синтаксиса , кажется общепризнанным, что это более понятный способ использования вещей.

...