我需要 xUnit 来处理内部测试类。 问题是我使用了通用基础测试夹具 UnitTestBase。 所以我将我的装置创建为
class MyFixture: UnitTestBase<SomeSystemUnderTheTest>
{
...
}
在某些情况下
SomeSystemUnderTheTest
似乎是内部类。我们称其为SomeSystemUnderTheTestInternal
。因此,即使 UnitTestBase<SomeSystemUnderTheTestInternal>
是公开的,UnitTestBase
也似乎是内部的。因此,我无法将 MyFixture
指定为公共,因为编译器表示您的基类的可访问性较低。因此,在我的例子中,MyFixture 只能是内部的,但 xUnit 要求它是公共的。有没有办法让 xUnit 与内部固定装置一起工作?
SomeSystemUnderTheTest 是一个实现某些接口的类。它不会在任何地方直接使用,只是由 DI 容器注入。它被标记为内部。我稍微简化了上面的情况,SomeSystemUnderTheTest 实际上是从泛型类 SomeSystemUnderTheTestBase 派生的,其中 SomeInternalClass 是一个内部类,因此整个树都是内部的。我无法改变它,因为这不是我们想做的事情。
将其添加到
SomeSystemUnderTestInternal
文件中的命名空间声明上方:
[assembly: InternalsVisibleToAttribute("TestProject")]
其中
TestProject
是包含测试类的项目的程序集名称。
迟到的答案,但我必须自己解决这个问题。这是一种潜在的解决方法模式,用 .NET 8 编码:
在此处定义任何测试方法
public abstract class TestBase
{
[Fact]
public abstract void TestMethod();
}
从 TestBase 继承,因此可以用作委托
public abstract class UnitTestBase<TSubjectUnderTest> : TestBase
{
[Fact]
public override void TestMethod()
{
// Implement test for TSubjectUnderTest
}
}
实施测试方法并委托它们。这就是解决方法实际发生的地方
public abstract class DelegateTestBase : TestBase
{
protected abstract TestBase GetDelegate();
[Fact]
public override void TestMethod
=> GetDelegate().TestMethod();
}
在这里实现委托模式
public class MyFixture : DelegateTestBase
{
private class Delegate : UnitTestBase<SomeSystemUnderTheTest>;
protected override TestBase GetDelegate() => new Delegate();
}
这是有效的,因为
MyFixture
是公共的并且可以被 xUnit 发现。它允许委托提供内部 SomeSystemUnderTheTest
的通用类型类。