c# - 使用 RhinoMocks .NET 进行简单模拟的问题

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

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

关于导致问题的原因以及如何克服它的任何想法?

最佳答案

我认为您需要在 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 ,似乎人们普遍认为这是一种更清晰的使用方式。

关于c# - 使用 RhinoMocks .NET 进行简单模拟的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208134/

相关文章:

c# - 预测 .Net 随机序列中的下一个数字

c# - 如何根据自己的属性和另一个列表的属性对列表进行排序?

c# - EF 根据数据库更改重新生成代码模型

c# - MSMQ接收和删除

c# - 如何从 .NETStandard,Version=v1.7 访问 BinaryFormatter

javascript - Jest 测试上下文/监视在函数外部创建的模拟变量(类级别)

unit-testing - 客户端-服务器应用程序上的 TDD

c# - 在 SQL Server 2008 中调用存储过程时超时

c# - 调试作为 VS 解决方案的一部分运行的 NuGet

unit-testing - Redux 如何在单元测试中更新存储?