【问题标题】:Troubles with simple mocking using RhinoMocks .NET使用 RhinoMocks .NET 进行简单模拟的问题
【发布时间】:2010-02-05 15:10:58
【问题描述】:

我正在尝试使用 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 类型)在记录中时,该操作无效状态

有什么想法导致麻烦以及如何克服它?

【问题讨论】:

    标签: c# .net unit-testing mocking rhino-mocks


    【解决方案1】:

    我认为您需要在 mocks.Playback() 之外创建 new MockIdentityResolver()

    [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 syntax,似乎普遍认为这是一种更清晰的使用方式。

    【讨论】:

    • 我已经采纳了您的建议,并以 AAA 语法的方式完全重写了这个东西,现在它就像魅力一样工作。谢谢;)
    • 我对 AAA 语法的另一个 +1 ; Rhino Mocks 的作者 Oren Eini 提到他的框架的下一个版本将取消 Record/Playback 语法,而只提供 AAA 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多