xUnit 测试类内部
Posted
技术标签:
【中文标题】xUnit 测试类内部【英文标题】:xUnit test class internal 【发布时间】:2021-04-20 03:51:22 【问题描述】:我需要 xUnit 来处理内部测试类。 问题是我使用了通用基础测试夹具 UnitTestBase。 所以我将我的灯具创建为
class MyFixture: UnitTestBase<SomeSystemUnderTheTest>
...
在某些情况下,SomeSystemUnderTheTest
似乎是内部类。让我们称之为SomeSystemUnderTheTestInternal
。结果UnitTestBase<SomeSystemUnderTheTestInternal>
也似乎是内部的,即使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 可见) - 将<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"> <_Parameter1>DynamicProxyGenAssembly2</_Parameter1> </AssemblyAttribute>
放在 csproj 中,但对于 Xunit 似乎不可能。可能对测试类来说太复杂了,我不知道。以上是关于xUnit 测试类内部的主要内容,如果未能解决你的问题,请参考以下文章
如何在需要 UserManager 但使用内存数据库的 XUnit 中测试方法
我需要xUnit测试用例。 Microsoft.Azure.Cosmos容器