使用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。
我该怎么做呢?
嗯,这取决于你在哪里实例化你的CoreDataContext。如果它是在静态上下文中或在构造函数中构造的,则实际上没有办法为它创建一个mock。这就是为什么在对象内部实例化依赖通常被认为是不好的做法。您需要做的是提供一些依赖项注入的方法。这可以像重载构造函数一样简单:
public RatesControlReport(CoreDataContext context)
{
_coreDataManager = context;
}
…如果你不顾一切,甚至可以使用内部方法:
internal void InjectContext(CoreDataContext context)
{
_coreDataManager = context;
}
一般来说,在构造RatesControlReport时,总是提供CodeDataContext对象被认为是最佳实践。这将把数据访问从业务逻辑中分离出来,这将允许您更有效地对这两个类进行单元测试。