Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SimpleInjector:在测试数据库上对控制器的方法进行端到端测试_C#_Asp.net_Asp.net Web Api_Simple Injector - Fatal编程技术网

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

C# SimpleInjector:在测试数据库上对控制器的方法进行端到端测试,c#,asp.net,asp.net-web-api,simple-injector,C#,Asp.net,Asp.net Web Api,Simple Injector,我有一个带有多个REST API控制器的web应用程序。此控制器已按照使用SimpleInjector的方式注入存储库。我想在我的项目中添加一些端到端测试,以确保控制器的方法调用以可预测的方式影响数据库。我首先使用的是EF6、MySQL和代码。我打算用它来测试我的应用程序。我喜欢整体方法,但在这种方法中,作者似乎是将db上下文直接输入控制器。在我的例子中,我有一个控制器,它从构造函数中获取一个注入的存储库,然后再将存储库注入DbContext。显然,我可以硬编码创建DbContext、实例化存储

我有一个带有多个REST API控制器的web应用程序。此控制器已按照使用SimpleInjector的方式注入存储库。我想在我的项目中添加一些端到端测试,以确保控制器的方法调用以可预测的方式影响数据库。我首先使用的是EF6、MySQL和代码。我打算用它来测试我的应用程序。我喜欢整体方法,但在这种方法中,作者似乎是将db上下文直接输入控制器。在我的例子中,我有一个控制器,它从构造函数中获取一个注入的存储库,然后再将存储库注入DbContext。显然,我可以硬编码创建DbContext、实例化存储库和实例化控制器的链,但这有点违背了使用SimpleInjector的目的,不是吗?我认为应该有更透明的方式来做这件事

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

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

其他信息:我使用的是.Net Framework非核心,除非有必要,否则我希望暂时不使用模拟进行管理。

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


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


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

谢谢您的回答。当然,这不是一个端到端的测试,因为我不会发送任何HTTP请求,即使我会考虑在你提到它的时候做。我将通过实例化一个控制器并调用其方法来测试它。理想情况下,我希望测试能够并行运行,每次都在一个清晰的数据库上运行,并且在内存中的同一个DB server version=no上运行。我计划为每个测试生成一个模式的guid名称,并在拆卸时删除这个shcema。因此,我需要在普通版本和测试版本上为DbContext使用不同的构造函数。在这种情况下,为每个测试构建一个新的容器实例,并按照JSteward的答案进行操作。谢谢,我将尝试一下。