如何使用Rhino模拟只测试测试对象中的一个值?

时间:2011-01-24 11:56:49

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

对我们的代码进行了一些更改,现在我需要重新考虑一些单元测试,以确保它们与新代码兼容。我遇到了一个问题。在这:

            ChannelLoad loader = new ChannelLoad(_customerDbMock, _bulkCopyMock);
            loader.Execute(taskId);

“loader”对象现在正在尝试连接到另一个对象,以便在字符串自动返回之前获取字符串值。因此,显而易见的解决方案是模拟该对象以返回适合测试的值。但由于各种原因,我不能轻易做到这一点。

理想情况下,我希望能够做的是获得“真实”(即代码中指定的)加载器对象,该对象执行“真正的”Execute方法,但该特定字符串具有“模拟”值。但是我真的不知道如何做到这一点 - 即使有可能 - 用Rhino Mocks。有问题的字符串属性不是抽象的或任何东西 - 它受到保护,它实际上是只读的。这就是它在“loader”中的样子:

    protected string DbConnectionString
    {
        get
        {
            return _Service.GetLocalDatabase().GetConnectionString(_Service);
        }
    }

问题是,对于测试环境,“GetLocalDatabase”不返回任何内容。

有人帮我出去吗?有没有办法可以使用Rhino Mocks来模拟它,或者我是唯一可以重构代码以使其不依赖于外部对象的选项?如果是后者,指针也会有所帮助。

干杯, 马特

2 个答案:

答案 0 :(得分:3)

如果您不想注入_Service:

,还有其他两个选项

创建一个继承自ChannelLoad的类(称之为“TestableChannelLoader”或其他东西)和

  1. 覆盖DbConnectionString-Property或

  2. 提取一个方法“GetConnectionString”,您可以在新类中覆盖该方法并在DbConnectionString-Property中调用它

答案 1 :(得分:2)

我看到加载器依赖于_Service。因此,您需要将此依赖项的mock注入到loader中,以便更改DbConnectionString属性行为。