xUnit 测试类内部

Posted

技术标签:

【中文标题】xUnit 测试类内部【英文标题】:xUnit test class internal 【发布时间】:2021-04-20 03:51:22 【问题描述】:

我需要 xUnit 来处理内部测试类。 问题是我使用了通用基础测试夹具 UnitTestBase。 所以我将我的灯具创建为

class MyFixture: UnitTestBase<SomeSystemUnderTheTest>

...

在某些情况下,SomeSystemUnderTheTest 似乎是内部类。让我们称之为SomeSystemUnderTheTestInternal。结果UnitTestBase&lt;SomeSystemUnderTheTestInternal&gt; 也似乎是内部的,即使UnitTestBase 公开。因此,我无法将 MyFixture 指定为公开的,因为编译器说您的基类具有较少的可访问性。所以我的 MyFixture 只能是内部的,但是 xUnit 要求它是公共的。有没有一种解决方法可以让 xUnit 与内部固定装置一起工作?

SomeSystemUnderTheTest 是一个实现某些接口的类。它不会直接在任何由 DI 容器注入的地方直接使用。它被标记为内部。我稍微简化了上面的情况,SomeSystemUnderTheTest 实际上是从泛型类 SomeSystemUnderTheTestBase 派生的,其中 SomeInternalClass 是一个内部类,因此整个树都是内部的。我无法更改它,因为这不是我们想做的事情。

【问题讨论】:

SomeSystemUnderTheTest 是什么?为什么在某些情况下似乎是内部类?在其他情况下它是否显示为公共课程?怎么样? @ChetanRanpariya 我已经更新了问题并解释了什么是类以及为什么它是内部的 你真的不需要最后一段解释为什么一个类可能是内部的。类是内部的是完全合理的!我只想说“在某些情况下SomeSystemUnderTheTest 将是一个内部类”而不是“似乎是”。 【参考方案1】:

SomeSystemUnderTestInternal 文件中的命名空间声明上方添加:

[assembly: InternalsVisibleToAttribute("TestProject")]

其中TestProject 是包含您的测试类的项目的程序集名称。

【讨论】:

我已经有了它,但它没有帮助。如果将相同的属性添加到 xUnit 程序集中可能会有所帮助,但我真的怀疑。 xUnit 明确表示测试类应该是公开的。 这只是让你的测试项目看到你的主要项目的内部。 OP(和我)需要的是相当于放入测试项目中的东西,它允许测试项目的内部对 xUnit 可见。您可以为 Moq 做类似的事情(使主要项目的内部对 Moq 可见) - 将 &lt;AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"&gt; &lt;_Parameter1&gt;DynamicProxyGenAssembly2&lt;/_Parameter1&gt; &lt;/AssemblyAttribute&gt; 放在 csproj 中,但对于 Xunit 似乎不可能。可能对测试类来说太复杂了,我不知道。

以上是关于xUnit 测试类内部的主要内容,如果未能解决你的问题,请参考以下文章

使用样式表显示来自多个XML文件的xUnit测试数据

如何在需要 UserManager 但使用内存数据库的 XUnit 中测试方法

我需要xUnit测试用例。 Microsoft.Azure.Cosmos容器

Xunit 内存数据库中的新 DBContext 类具有实时数据

使用hangfire在xunit中

XUnit 模拟传递和断言集合