如何使用注入的依赖项(也具有MOQ或Fake的依赖项)对.NET api核心控制器进行单元测试?

时间:2019-02-19 13:37:40

标签: unit-testing moq asp.net-core-webapi

我实现了一个api控制器,该API控制器将由另一个系统的一部分使用,而不是直接用于用户。但是,我想为其提供单元测试。我开始查看起订量,然后意识到我的具体情况要复杂一些。该代码有效,但是正如我所说,我试图对此进行测试,而没有(理想情况下)将任何数据写入Db。

类的结构如下:

api controller
    |__MyCustomClass (injected via startup along with configuration)
            |__UtilityClass (method: ImportSomeDataFromaFolder)
                |__MydataRepositoryClass
                    |__CustomDerivedDbContext
                        (override savechanges etc so as to capture EF errors)

注意:
-api方法的返回值是一个复杂的JSON对象。
-我想进行一次测试,避免实际写入Db
-我正在创建一个自定义的DbContext(CustomDerivedContext)并覆盖保存更改,以便捕获在列表中通过更改的EF实体。 List<EntityEntry>
-方法ImportSomeDataFromaFolder,在将数据解析为POCO对象并将其发送到存储库以持久保存到Db之后,然后将文件移动到另一个文件夹。在测试时,我宁愿没有发生这种情况,而只是加载要分析的文件。

  • 要测试的三件事:
    (1)是否将文件中的数据加载到POCO对象中
    (2)是否将POCO对象正确转换为EF模型实体
    (3)api是否返回包含预期结果的JSON对象

或者,我使事情变得比单元测试应该做的还要复杂。我想针对api控制器编写一个测试,但是它的CustomDerivedDbContext似乎我想在这里使用假的,因为我随后可以删除实际上调用基础DbContext savechanges的步骤。

1 个答案:

答案 0 :(得分:0)

像您这样的声音与实施方面的关注紧密相连,这使得孤立地测试主题变得困难。

应将其视为代码的味道,并表示需要对当前的设计选择进行审查和重构。

如果对API控制器进行单元测试,那么理想情况下,您所需要做的只是对显式注入的抽象进行模拟。

如果遵循适当的关注点分离,API控制器无需了解有关其依赖项的依赖项。