所以我只是习惯于嘲笑东西。我在这里有这个私有变量:
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>
,以便测试可以继续而不依赖于数据库。
我该怎么做?
答案 0 :(得分:5)
嗯,这取决于您实例化CoreDataContext的位置。如果这是在静态上下文中构造的,或者在构造函数中构造,则实际上没有办法为它创建模拟。这就是为什么在对象内实例化依赖关系通常被认为是不好的做法。您需要做的是提供一些依赖注入方法。这可以像重载的构造函数一样简单:
public RatesControlReport(CoreDataContext context)
{
_coreDataManager = context;
}
...如果你绝望,甚至是内部方法:
internal void InjectContext(CoreDataContext context)
{
_coreDataManager = context;
}
但是,一般来说,在构造RateControlReport时,始终提供CodeDataContext对象被认为是最佳做法。这将把数据访问与业务逻辑分开,这将允许您更有效地对两个类进行单元测试。