代码之家  ›  专栏  ›  技术社区  ›  Tomas Vana

使用Rhinomocks.net进行简单模拟的问题

  •  3
  • Tomas Vana  · 技术社区  · 16 年前

    我试着用犀牛模型做实验,我不得不说我是个新手,可能我在这里没有什么明显的东西。我所做的是:

        [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 回复  |  直到 16 年前
        1
  •  4
  •   Sam Holder Brian Adams    16 年前

    我认为你需要创造你 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 syntax 人们似乎普遍认为这是一种更清晰的使用方法。