【问题标题】:Using Rhino Mocks to mock private objects call使用 Rhino Mocks 模拟私有对象调用
【发布时间】:2011-12-11 20:12:17
【问题描述】:

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

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&lt;CheckSwaptionVols&gt;,这样测试就可以在不依赖数据库的情况下继续进行。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    然而,一般来说,在构造 RatesControlReport 时始终提供 CodeDataContext 对象被认为是最佳实践。这会将数据访问与业务逻辑分开,从而使您可以更有效地对这两个类进行单元测试。

    【讨论】:

    • +1 同意。不将对象传递给构造函数会导致单元测试的设置非常“痛苦”。或者更糟的是,放弃单元测试,因为它们太麻烦了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多