我应该测试我的控制器的Action方法是否正在调用存储库方法并生成正确的视图?

时间:2013-08-16 13:34:31

标签: c# asp.net-mvc unit-testing asp.net-mvc-4 testing

我是测试的新手,我刚开始测试我的MVC应用程序。

目前我正在测试我的控制器的操作方法是否正在调用正确的存储库方法,而这些方法又从数据库中读取或写入数据。

我还在测试的是,操作方法的返回类型是ViewPartialView还是RedirectToRoute等。

我有一些评论说测试控制器的Action方法是否在存储库中调用正确的函数并不是真的有意义。这是真的吗?

我应该在我的MVC应用程序的单元测试中包含哪些内容,它也使用了Repository模式。

3 个答案:

答案 0 :(得分:1)

检查您的存储库上的操作是否调用了正确的方法是有意义的,但您需要对其进行模拟以避免访问数据库。单元测试应与外部组件隔离。

虽然它不理想,但您可以用内存中的轻量级Sqlite替换“真实”数据库,以避免在测试中模拟数据库访问。

我个人使用Moq作为模拟框架,但它有很多成熟的.NET模拟框架。

考虑测试方法是否检查行为而不是状态。这使得测试更加脆弱,因为它依赖于内部实现,但根据您的情况,它可能是完全有效的。

答案 1 :(得分:0)

单元测试是关于在隔离中测试组件的行为,这意味着在测试特定组件时,此组件不会与任何外部组件相互作用。

通常,这样做的方法是使用模拟。所有依赖项必须是mock,以便您可以控制它们。 测试方法是否有效。如果逻辑不在您测试的组件上,那么您的工作就完成了。在另一种情况下,组件调用函数和案例x,y和z。行为很好吗?多数民众赞成。

如果由于您具有数据库依赖性而难以测试,那通常是设计问题。通常,这是通过在数据库前使用数据库抽象来解决的,数据库的唯一作用是make调用并从数据库返回值。这种抽象可以在您的测试类中进行模拟和注入。这样,您甚至可以将预先配置的值返回到测试类并继续该过程。

答案 2 :(得分:0)

这取决于不同的场景,例如,在控制器中,你有一个动作 bool SaveEmployee(),内部调用,服务,然后保存数据库层。因此,测试Emp是否实际保存在db中没有意义,因为它应该在相应的数据库层功能的另一个单元测试中。在这里,您只需要在成功,失败,复制或抛出一些异常后验证状态。您可以简单地模拟函数并返回bool或字符串(如适当的话),并使用预期的输出验证实际输出。