【问题标题】:Mocking an Object Within an Object在对象中模拟对象
【发布时间】:2012-07-13 10:26:37
【问题描述】:

我已经开始学习 Rhino Mocks 并且能够按照在线 wiki 中的示例进行操作。我以为我会将这些知识应用到我的一个家庭项目中,但在与技术抗争了数小时后,我陷入了困境。这是我正在尝试做的事情(如果我没有提供足够的信息,请告诉我——我不想只是做一个巨大的代码转储):

我有一个名为 DataSurface 的类。

它有一个名为unitOfWork的成员,它又包含三个存储库TaskRepositoryWorkRepositoryProjectRepository。每个都作为 Getter 属性公开。

DataSurface 中有一个 InsertNewWorkItem 方法,它调用 TaskRepository 上的 Find 方法,如下所示:

public void InsertNewWorkItem(Entities.Work workItem)
{
    var taskForWorkItem = this.unitOfWork.TaskRepositoryInstance.Find(t => t.ID == workItem.TaskId).First();

    Work newWorkItem = new Work
    {
       DateOfWork = workItem.DateOfWork,
       Description = workItem.Description,
       Duration = workItem.Duration,           
       Task1 = taskForWorkItem,
       Week = workItem.WeekNumber,
    };

        this.unitOfWork.WorkRepositoryInstance.Add(newWorkItem);
        this.unitOfWork.WorkRepositoryInstance.SaveChanges();
}

我希望验证的是 TaskRepositoryFind 方法已被调用。

因为存储库是“2 类深度”,即成员中的成员相对于 InsertNewWorkItem 方法,我似乎根本无法创建存储库模拟对象。

我觉得我正在尝试做的是一种反模式。

我也意识到代码可能不是可模拟的,因为它是。我尝试了在 unitofwork 中实例化存储库的每种组合(例如构造函数 DI),但每次,Rhino Mocks 都会抛出错误。

有没有测试专家可以帮我弄清楚。

干杯!

【问题讨论】:

    标签: unit-testing mocking rhino-mocks rhino-mocks-3.5


    【解决方案1】:

    您需要通过接口抽象所有类,然后才能模拟任何东西,是的,您可以深入模拟 N 级。

    顺便说一句,您是以某种方式将unitOfWork 注入DataStructure 类还是在类中显式地实例化它?为了能够模拟它,您需要将其注入,通常这是经验法则 - 注入依赖项而不是在类中实例化它。

    【讨论】:

    • 这是我认为代码不可模拟的部分。我不希望存储库实现自己的接口。它们继承自一个抽象类: GenericRepository : IGenericRepository 我不希望每个存储库也继承自另一个接口,从而增加了进一步的专业化方法。然后,你就开始编写到处乱飞的接口的疯狂而难以管理的代码。
    • 让我猜猜 - 您不是使用具有描述性名称的业务特定方法,而是将 IQueryable 到处公开为“可管理”代码?
    • @lazyberezovsky 我被要求称你为旋钮。不知道什么意思,我只是在帮助 OP。
    • 我不明白 hg lim 的评论。多么随机。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多