Проблемы с простым мокингом с использованием RhinoMocks .NET

Я пытаюсь поэкспериментировать с 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) находится в записи государство.

Любые идеи о том, что вызывает проблемы и как это преодолеть?


person Tomas Vana    schedule 05.02.2010    source источник


Ответы (1)


Я думаю, вам нужно создать вас 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, как правило, признал, что это более понятный способ использования вещей.

person Sam Holder    schedule 05.02.2010
comment
Я воспользовался вашим советом и полностью переписал синтаксис AAA, и теперь он работает как часы. Спасибо ;) - person Tomas Vana; 05.02.2010
comment
Еще один +1 от меня за синтаксис AAA; Автор Rhino Mocks, Орен Эйни, упомянул, что следующая версия его фреймворка избавится от синтаксиса записи/воспроизведения и предложит только синтаксис AAA. - person Judah Gabriel Himango; 23.04.2010