SimpleInjector:在测试数据库上对控制器方法进行端到端测试

SimpleInjector: End-to-end testing of controller's methods on a test database

我有一个带有多个 REST API 控制器的网络应用程序。这个控制器根据 this tutorial using SimpleInjector. I'd like to add some end-to-end testing to my project to make sure controller's method calls affect database in predictable manner (I'm using EF6, MySQL, code first). I was going to use this plan 注入了存储库来测试我的应用程序。我喜欢整体方法,但似乎在这种方法中,作者将数据库上下文直接输入控制器。在我的例子中,我有一个 Controller,它从构造函数中获取注入的 Repository,然后 Repositiry 被注入 DbContext。显然,我可以硬编码创建 DbContext、实例化 Repository,然后实例化 Controller 的链,但这有点违背使用 SimpleInjector 的目的,不是吗?我觉得应该有更透明的方法。

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

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

其他信息:我正在使用 .Net Framework(非核心),除非需要,否则我现在想在没有模拟的情况下进行管理。

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

Override Registrations - 仅供测试

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

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