使用Rhino mock模拟私有对象调用

本文关键字:对象 调用 模拟 Rhino mock 使用 | 更新日期: 2023-09-27 18:12:05

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

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>,以便测试可以继续而不依赖于DB。

我该怎么做呢?

使用Rhino mock模拟私有对象调用

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

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

…如果你不顾一切,甚至可以使用内部方法:

internal void InjectContext(CoreDataContext context)
{
    _coreDataManager = context;
}
一般来说,在构造RatesControlReport时,总是提供CodeDataContext对象被认为是最佳实践。这将把数据访问从业务逻辑中分离出来,这将允许您更有效地对这两个类进行单元测试。