在使用通用基础测试类进行测试时正确使用内部类

时间:2019-03-22 08:44:41

标签: c# unit-testing

TL; DR 我似乎无法 InternalsVisibleTo 来进行单元测试

背景

我目前正在开发一个库,在该库中,我希望在内部建立一些(但不是全部)类,以避免使用户感到困惑。只有某些类应该从该dll中公开。

我认为这是学习如何使用C#中的 internal 关键字的好项目。

每当我创建一个新项目时,我都会使用DDD的变体,将职责划分为不同的DLL,但出于这个问题,请考虑一下我的项目结构(从上到下) ):

  • 使用我的库的可执行文件
  • 我正在开发的库
  • 用于对我的库进行单元测试的单元测试库
  • 测试工具库,包含所有单元测试的基类

有关该架构的工作示例,您可以在github上查看我的HelloWorld project。这个示例在这里并未重现问题,仅用于说明我通常如何分层代码。

我经常为我的单元测试创​​建一个基类,该基类为我正在测试的任何类型创建模拟,即以下示例:

public class TestsFor<TInstance> where TInstance : class
{
    protected MoqAutoMocker<TInstance> AutoMock { get; set; }
    protected TInstance Instance { get; set; }

    public TestsFor()
    {
        AutoMock = new MoqAutoMocker<TInstance>();

        RunBeforeEachUnitTest(); // virtual

        Instance = AutoMock.ClassUnderTest;

        RunAfterEachUnitTest(); // virtual
    }
}

问题

我编写的单元测试通常采用以下形式:

public class ReportServiceTests : TestsFor<ReportService>
{
    [Fact]
    public async Task CreateReport_WhenCalled_LogsTheCall()
    {
        // Act
        await Instance.CreateReport();

        // Assert            
        GetMockFor<ILogger>().Verify(logger => logger.Enter(Instance, nameof(Instance.CreateReport)), Times.Once());
    }
}

每个单元测试将在其中派生 TestsFor 类的地方,以便为我提供开箱即用的模拟测试类。但是,即使我已经用 InternalsVisibleTo 标记了我的内部类,将它们指向单元测试程序集和测试工具程序集(单元测试基类所在的位置),我还是出现可访问性不一致错误。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您遇到的问题是您试图创建一个比其基类更易于访问的类。

您可以委派而不是派生:

$ ./bin/vector_2d_subset < dat/universal_sub.txt
 1 2 3 4 5
 1 2 3
 1 2 3 4
 1 2 3 4 5 6