我应该测试我的控制器';s Action方法调用存储库方法并生成正确的视图
本文关键字:方法 视图 存储 调用 控制器 我的 我应该 Action 测试 | 更新日期: 2023-09-27 18:27:54
我刚开始测试MVC应用程序。
目前,我正在测试我的控制器的操作方法是否调用了正确的存储库方法,从而从数据库中读取或写入数据。
我还测试的是动作方法的返回类型是View
、PartialView
还是RedirectToRoute
等。
我有一些评论说,测试控制器的Action方法是否在存储库中调用了正确的函数是没有意义的。这是真的吗?
我应该在MVC应用程序的单元测试中包括什么,它也使用Repository模式。
检查您的操作是否在存储库上调用了正确的方法是有意义的,但您需要模拟它以避免访问数据库。单元测试应与外部组件隔离。
尽管这并不理想,但您可以用轻量级内存Sqlite替换"真实"数据库,以避免在测试中嘲笑您的数据库访问。
我个人使用Moq
作为mocking框架,但它是.NET的许多成熟的mocking框架
考虑到如果调用方法,则测试会检查行为而不是状态。这使得测试更加脆弱,因为它依赖于内部实现,但根据您的场景,它可能完全有效。
单元测试是在隔离中测试组件的行为,这意味着在测试特定组件时,该组件不会与任何外部组件交互。
通常,这样做的方法是使用mock。所有依赖项都必须是mock,这样您才能控制它们。测试是否调用了方法是有效的。如果逻辑不在您测试的组件上,那么您的工作就完成了。您的组件调用一个函数,在另一种情况下调用大小写x、y和z。行为还好吗?这就足够了。
如果因为数据库依赖性而导致测试困难,那么这通常是一个设计问题。通常,这是通过在数据库前面使用数据库抽象来解决的,数据库的唯一工作是从数据库中调用和返回值。这个抽象可以被模拟并注入到测试的类中。这样,您甚至可以将预先配置的值返回到测试的类,并继续该过程。
这取决于不同的场景,例如,在控制器中,您有一个操作bool SaveEmployee()
,它内部调用,服务,然后数据库层保存。因此,测试Emp是否真的保存在数据库中是没有意义的,因为它应该在对应数据库层Function的另一个单元测试中进行。在这里,您只需要在成功、失败、重复或抛出一些Exception之后验证状态。您可以简单地模拟函数并返回bool或字符串(如Success,视情况而定),然后用预期的output验证实际输出。