假设我有以下控制器:
//
// 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()将返回我想要的但是该方法依赖于某些相关实体的课程被“补充”,因此可能成为一件苦差事接通电话。
我是新手测试,所以不确定如何继续。
答案 0 :(得分:2)
如果他们将您要模拟的方法标记为虚拟,则可以模拟它们。
答案 1 :(得分:0)
POCOs
不应包含任何业务逻辑。它们是“Plain Old CLR Objects”。
您的业务逻辑应位于服务层中,您可以将其注入控制器。
如果您需要为POCOs
添加额外的属性,那可以(将其标记为[NotMapped]
),或者您可以(并且应该)使用ViewModels
,这是{{1} 3}}可能会告诉你!
你认为POCOs
不应该要求接口是正确的。实际上,POCOs
的接口使得使用EntityFramework
导航属性几乎是不可能的(但实际上并非不可能,我已经完成了,尽管是以一种非常糟糕的,黑客的方式)。
我可以稍后更充分地回答,但现在我需要回到我的妻子和孩子的家里!