使用Rhino Mocks来模拟私有对象调用

时间:2011-10-20 14:12:33

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

所以我只是习惯于嘲笑东西。我在这里有这个私有变量:

private CoreDataContext _coreDataManager;

在这堂课上:

public class RatesControlReport
        : Chatham.Panda.Batch.ProcessDefinition.BatchProcess

此类有一个void方法,我想测试它CheckSwaptionVols(DateTime runDate)

在我的测试的第一部分中,我可以实例化主类:

RatesControlReport ratesControlReportProcess;
            ratesControlReportProcess = new RatesControlReport();

基本上我想打这个电话:

ratesControlReportProcess.CheckSwaptionVols(DateTime.Now);

但是这个方法使用私有变量:

System.Data.Linq.ISingleResult<CheckSwaptionVols> swaptionStatusResult = _coreDataManager.CheckSwaptionVols(this._runDate);

我希望能够传入此变量的模拟版本并返回我自己指定的System.Data.Linq.ISingleResult<CheckSwaptionVols>,以便测试可以继续而不依赖于数据库。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

嗯,这取决于您实例化CoreDataContext的位置。如果这是在静态上下文中构造的,或者在构造函数中构造,则实际上没有办法为它创建模拟。这就是为什么在对象内实例化依赖关系通常被认为是不好的做法。您需要做的是提供一些依赖注入方法。这可以像重载的构造函数一样简单:

public RatesControlReport(CoreDataContext context)
{
    _coreDataManager = context;
}

...如果你绝望,甚至是内部方法:

internal void InjectContext(CoreDataContext context)
{
    _coreDataManager = context;
}

但是,一般来说,在构造RateControlReport时,始终提供CodeDataContext对象被认为是最佳做法。这将把数据访问与业务逻辑分开,这将允许您更有效地对两个类进行单元测试。