【问题标题】:SimpleInjector: End-to-end testing of controller's methods on a test databaseSimpleInjector:在测试数据库上对控制器方法进行端到端测试
【发布时间】:2018-06-13 14:33:37
【问题描述】:

我有一个带有多个 REST API 控制器的网络应用程序。该控制器使用 SimpleInjector 根据this tutorial 获得注入的存储库。我想在我的项目中添加一些端到端测试,以确保控制器的方法调用以可预测的方式影响数据库(我使用的是 EF6、MySQL、代码优先)。我打算使用this plan 来测试我的应用程序。我喜欢整体方法,但似乎在这种方法中作者将数据库上下文直接输入控制器。在我的情况下,我有一个控制器,它从构造函数获取注入的存储库,然后存储库被注入 DbContext。显然,我可以硬编码创建 DbContext、实例化 Repository 然后实例化 Controller 的链,但这有点违背了使用 SimpleInjector 的目的,不是吗?我认为应该有更透明的方式。

基本上我想在我的测试中注入单独的数据库。当服务器运行时,它使用一个数据库,当测试运行时,它们使用另一个临时数据库。

我的测试类在一个单独的项目中,所以我需要一种方法来从主项目中实例化我的控制器和存储库。我也不确定我该怎么做。以某种方式从另一个项目中公开我的SimpleInjector.Container 是个好主意吗?

附加信息:我正在使用 .Net Framework(非核心),除非需要,否则我想暂时不使用模拟进行管理。

【问题讨论】:

    标签: c# asp.net asp.net-web-api simple-injector


    【解决方案1】:

    您可以在接口后面抽象出DbContext,并使用 SimpleInjector 的选项覆盖测试的注册。这将允许您注册上下文的不同实现以进行测试。然后在您的测试设置代码中调用您的标准注册,假设它们都在您的组合根和/或引导项目中。然后翻转覆盖开关并注册测试上下文。

    Override Registrations - 仅用于测试

    【讨论】:

    • 谢谢,我试试看。
    【解决方案2】:

    就您而言,我希望您不必特别做任何事情。您的端到端测试将通过 HTTP 调用 Web 应用程序的测试版本,并且此测试应用程序配置 带有指向测试数据库的连接字符串。这样您就可以使用完全相同的 DI 配置,而无需进行任何更改。您当然不想在测试期间注入不同的DbContext

    另一个选项是在内存中测试,这意味着您不会通过 HTTP 调用 Web 应用程序,而是直接从 Simple Injector 请求控制器并调用其方法。这里也是一样的:你唯一想要改变的是你的连接字符串,它应该已经是可配置的了。

    【讨论】:

    • 感谢您的回答。好吧,它不完全是一个端到端的测试,因为我不会发送任何 HTTP 请求,即使当你提到它时我会考虑现在这样做。我打算通过实例化一个控制器并调用它的方法来测试它。理想情况下,我希望每次都在同一个数据库服务器版本上并行运行并在一个清晰的数据库上运行测试(= 对我来说没有内存)。我计划为每个测试生成一个模式的 guid 名称,并在拆卸时移除这个 shcema。因此,我需要在普通版本和测试版本上为 DbContext 提供不同的构造函数。
    • 在这种情况下,为每个测试构建一个新的 Container 实例,然后使用 Jsteward 的答案。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多