对我们的代码进行了一些更改,现在我需要重新考虑一些单元测试,以确保它们与新代码兼容。我遇到了一个问题。在这:
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来模拟它,或者我是唯一可以重构代码以使其不依赖于外部对象的选项?如果是后者,指针也会有所帮助。
干杯, 马特
答案 0 :(得分:3)
如果您不想注入_Service:
,还有其他两个选项创建一个继承自ChannelLoad的类(称之为“TestableChannelLoader”或其他东西)和
覆盖DbConnectionString-Property或
提取一个方法“GetConnectionString”,您可以在新类中覆盖该方法并在DbConnectionString-Property中调用它
答案 1 :(得分:2)
我看到加载器依赖于_Service。因此,您需要将此依赖项的mock注入到loader中,以便更改DbConnectionString属性行为。