Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型基类测试时正确使用内部类_C#_Unit Testing - Fatal编程技术网

C# 使用泛型基类测试时正确使用内部类

C# 使用泛型基类测试时正确使用内部类,c#,unit-testing,C#,Unit Testing,TL;博士 我似乎无法让内部可视化来处理我的单元测试 背景 我目前正在开发一个库,其中我希望将一些(但不是全部)类设置为内部类,以避免混淆用户。只有部分类应该是该dll中的公共类 我认为这将是一个学习如何处理C#中的内部关键字的好项目 每当我创建一个新项目时,我发现自己使用的是DDD的一个变体,我会将责任划分为不同的DLL,但是为了这个问题,请像这样思考我的项目结构(自上而下): 使用我的库的可执行文件 我正在开发的图书馆 用于单元测试的单元测试库我的库 测试工具库,包含所有单元测试的基类

TL;博士 我似乎无法让内部可视化来处理我的单元测试

背景 我目前正在开发一个库,其中我希望将一些(但不是全部)类设置为内部类,以避免混淆用户。只有部分类应该是该dll中的公共类

我认为这将是一个学习如何处理C#中的内部关键字的好项目

每当我创建一个新项目时,我发现自己使用的是DDD的一个变体,我会将责任划分为不同的DLL,但是为了这个问题,请像这样思考我的项目结构(自上而下):

  • 使用我的库的可执行文件
  • 我正在开发的图书馆
  • 用于单元测试的单元测试库我的库
  • 测试工具库,包含所有单元测试的基类
有关该体系结构的工作示例,您可以查看我在github上的介绍。不过,这个例子并没有在这里重复这个问题,它只是用来说明我通常是如何对代码进行分层的

我经常为我的单元测试创建一个基类,为我正在测试的任何类型创建模拟,例如:

公共类测试,其中TInstance:class
{
受保护的MoqAutoMocker自动模拟{get;set;}
受保护的TInstance实例{get;set;}
公共测试sfor()
{
AutoMock=新的MoqAutoMocker();
runbeforeachunitest();//虚拟
Instance=AutoMock.ClassUnderTest;
runaftereachunitest();//虚拟
}
}
问题 我编写的单元测试通常采用以下形式:

公共类ReportServiceTests:TestsFor
{
[事实]
公共异步任务CreateReport_WhenCalled_LogsCall()
{
//表演
等待Instance.CreateReport();
//断言
GetMockFor().Verify(logger=>logger.Enter(Instance,nameof(Instance.CreateReport)),Times.Once();
}
}
其中,每个单元测试将为
类派生测试,以便为我提供一个开箱即用的模拟测试类。然而,即使我已经用InternalsVisibleTo标记了我的内部类,将它们指向单元测试程序集和测试工具程序集(单元测试基类所在的地方),我仍然会遇到不一致的可访问性错误


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

您遇到的问题是,您试图创建一个比基类更容易访问的类

您可以委托而不是派生:

public class ReportServiceTests
{
    private Tests tests = new Tests();

    [Fact]
    public async Task CreateReport_WhenCalled_LogsTheCall()
    {
        tests.CreateReport_WhenCalled_LogsTheCall();
    }

    private class Tests : TestsFor<ReportService>
    {
        public async Task CreateReport_WhenCalled_LogsTheCall()
        {
            // Act
            await Instance.CreateReport();

            // Assert            
            GetMockFor<ILogger>().Verify(logger => logger.Enter(Instance, nameof(Instance.CreateReport)), Times.Once());
        }
    }
}
公共类ReportServiceTests
{
私有测试=新测试();
[事实]
公共异步任务CreateReport_WhenCalled_LogsCall()
{
tests.CreateReport_WhenCalled_logsCall();
}
私有类测试:TestsFor
{
公共异步任务CreateReport_WhenCalled_LogsCall()
{
//表演
等待Instance.CreateReport();
//断言
GetMockFor().Verify(logger=>logger.Enter(Instance,nameof(Instance.CreateReport)),Times.Once();
}
}
}

根据模拟库的工作方式,它可能正在动态创建程序集,并且这些程序集可能还需要使用InternalsVisibleTo进行标识。希望它使用一致的名称!您正在使用哪个模拟库?如果您正在使用Moq,请添加此
[assembly:InternalsVisibleTo(“DynamicProxyGenAssembly2”)]
我正在使用Moq作为模拟库。您根本就不能测试内部构件吗?只测试公共类,内部将通过它们进行测试。