模拟控制器测试的具体POCO业务逻辑

时间:2012-01-10 17:14:20

标签: asp.net-mvc asp.net-mvc-3 unit-testing mocking moq

假设我有以下控制器:

    //
    // GET: /Courses/Edit/5
    public ActionResult Edit(int id)
    {
        Course course = courseService.GetCourseByID(id);
        if (course != null && course.userCanAccess())
        {
            // Do stuff...
        }
    }

if语句被设计为一个简单的检查,以确保用户可以继续执行该操作。 Course实体本身提供了确定用户是否可以访问它的逻辑。这很好但但确实引起了一个问题:如何测试控制器。

我需要一种方法来确保course.userCanAccess()在我的控制器测试中返回特定的结果。我的实体POCO没有接口,所以我不相信我可以嘲笑它们(如果这是错误请纠正我。)

我的想法是我可以为测试创建一个完整的Couse对象,这个对象被配置为userHasAccess()将返回我想要的但是该方法依赖于某些相关实体的课程被“补充”,因此可能成为一件苦差事接通电话。

我是新手测试,所以不确定如何继续。

2 个答案:

答案 0 :(得分:2)

如果他们将您要模拟的方法标记为虚拟,则可以模拟它们。

答案 1 :(得分:0)

POCOs不应包含任何业务逻辑。它们是“Plain Old CLR Objects”。

您的业务逻辑应位于服务层中,您可以将其注入控制器。

如果您需要为POCOs添加额外的属性,那可以(将其标记为[NotMapped]),或者您可以(并且应该)使用ViewModels,这是{{1} 3}}可能会告诉你!

你认为POCOs不应该要求接口是正确的。实际上,POCOs的接口使得使用EntityFramework导航属性几乎是不可能的(但实际上并非不可能,我已经完成了,尽管是以一种非常糟糕的,黑客的方式)。

我可以稍后更充分地回答,但现在我需要回到我的妻子和孩子的家里!