模拟对象内的对象

时间:2012-07-13 10:26:37

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

我已经开始学习Rhino Mocks并且能够按照在线wiki中的示例进行操作。我以为我会将这些学习应用到我的家庭项目中,经过几个小时的反对技术后,我才会失败。这是我想要做的(如果我没有提供足够的信息,请让我知道 - 我不想只是做一个巨大的代码转储):

我有一个名为 DataSurface 的课程。

它有一个名为 unitOfWork 的成员,后者又包含三个存储库 TaskRepository WorkRepository ProjectRepository 。每个都作为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();
}

我希望验证的是调用 TaskRepository 查找方法。

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

我觉得我要做的就是反模式。

我也意识到代码可能不是可模仿的。我尝试了在单元工作中实例化存储库的每个组合(例如构造函数DI),但每次,Rhino Mocks都会抛出错误。

是否有任何测试专家可以帮助我。

干杯!

1 个答案:

答案 0 :(得分:0)

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

顺便说一句,您是否以某种方式unitOfWork注入DataStructure类或明确地在类中实例化它?为了能够模拟它你需要注入它,通常这是经验法则 - 注入依赖关系而不是在类中实例化它。