xUnit 测试类内部

问题描述 投票:0回答:2

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

class MyFixture: UnitTestBase<SomeSystemUnderTheTest>
{
...
}

在某些情况下

SomeSystemUnderTheTest
似乎是内部类。我们称其为
SomeSystemUnderTheTestInternal
。因此,即使
UnitTestBase<SomeSystemUnderTheTestInternal>
是公开的,
UnitTestBase
也似乎是内部的。因此,我无法将
MyFixture
指定为公共,因为编译器表示您的基类的可访问性较低。因此,在我的例子中,MyFixture 只能是内部的,但 xUnit 要求它是公共的。有没有办法让 xUnit 与内部固定装置一起工作?

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

c# xunit access-modifiers base-class
2个回答
3
投票

将其添加到

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

[assembly: InternalsVisibleToAttribute("TestProject")]

其中

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


0
投票

迟到的答案,但我必须自己解决这个问题。这是一种潜在的解决方法模式,用 .NET 8 编码:

创建一个 TestBase 类

在此处定义任何测试方法

public abstract class TestBase
{
    [Fact]
    public abstract void TestMethod();
}

修改UnitTestBase

从 TestBase 继承,因此可以用作委托

public abstract class UnitTestBase<TSubjectUnderTest> : TestBase
{
    [Fact]
    public override void TestMethod()
    {
        // Implement test for TSubjectUnderTest
    }
}

创建 DelegateTestBase 基类

实施测试方法并委托它们。这就是解决方法实际发生的地方

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
的通用类型类。

© www.soinside.com 2019 - 2024. All rights reserved.