Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 使用Linq Select时不是预期的结果_C#_Linq_Select_Moq_Xunit - Fatal编程技术网

C# 使用Linq Select时不是预期的结果

C# 使用Linq Select时不是预期的结果,c#,linq,select,moq,xunit,C#,Linq,Select,Moq,Xunit,我为引擎实现了单元测试,并在存储库模拟中设置了两种不同的方法。第一个很好,但是当我为第二个执行linq Select时,它返回0,而我设置了返回特定对象。 我在引擎中的代码: private readonly IEmployerWorkersClient _employerWorkersClient; private readonly IJobsClient _jobsClient; public EmployerWorkerEngine(IEmployerWorker

我为引擎实现了单元测试,并在存储库模拟中设置了两种不同的方法。第一个很好,但是当我为第二个执行linq Select时,它返回0,而我设置了返回特定对象。 我在引擎中的代码:

    private readonly IEmployerWorkersClient _employerWorkersClient;
    private readonly IJobsClient _jobsClient;

    public EmployerWorkerEngine(IEmployerWorkersClient employerWorkersClient, IJobsClient jobsClient,)
    {
        _employerWorkersClient = employerWorkersClient;
        _jobsClient = jobsClient;
    }

    public async Task<Grid<WorkerFiltered>> GetWorkersAsync(int employerId, GridState gridState)
    {
        var employerWorkers = await _employerWorkersClient.GetEmployerWorkersByEmployerIdAsync(employerId);

        int? payrollId = null;
        int? jobRoleId = null;
        DateTime? bookedStart = null;

        // !!!the following result is Empty collection!!!
        List<JobRoleExtended> jobRoles = (await _jobsClient.GetJobRoleExtendedByEmployerWorkerIdsAsync(employerWorkers.Select(ew => ew.Id), payrollId, jobRoleId, bookedStart)).ToList();
        // Other things
    }
私有只读IEEmployerWorkersClient\u employerWorkersClient;
专用只读IJobsClient\u作业客户端;
公共EmployerWorkerEngine(iEmployerWorkerClient EmployerWorkerClient,IJobsClient jobsClient,)
{
_employerWorkersClient=employerWorkersClient;
_jobsClient=jobsClient;
}
公共异步任务GetWorkersAsync(int-employerId,GridState-GridState)
{
var employerWorkers=wait_employerWorkers client.getEmployerWorkers ByEmployerIDAsync(employerId);
int?payrollId=null;
int?jobRoleId=null;
DateTime?bookedStart=null;
//!!!以下结果为空集合!!!
列出jobRoles=(wait _jobsClient.GetJobRoleExtendeDbyEmployerWorkerRidAsync(employerWorkers.Select(ew=>ew.Id)、payrollId、jobRoleId、bookedStart)).ToList();
//其他事情
}
以后我的单元测试课

    private readonly EmployerWorkerEngine _employerWorkerEngine;

    private readonly Mock<IEmployerWorkersClient> _employerWorkersClientMock;
    private readonly Mock<IJobsClient> _jobClientMock;

    public WorkersFilterTests()
    {
        _employerWorkersClientMock = new Mock<IEmployerWorkersClient>();
        _jobClientMock = new Mock<IJobsClient>();

        _employerWorkerEngine = new EmployerWorkerEngine(_employerWorkersClientMock.Object, _jobClientMock.Object,);
    }

    [Theory]
    [InlineData(1)]
    public async Task GetFilteredWorkersByEmployerIdSuccessSimple(int employerId)
    {
        // Arrange
        const int employerWorkerId = 3;
        var gridState = new GridState { Skip = 0, Take = 1 };
        var employerWorkers = new List<EmployerWorker> { new EmployerWorker {EmployerId = 1, WorkerId = 2, Id = employerWorkerId} };

        _employerWorkersClientMock.Setup(client => client.GetEmployerWorkersByEmployerIdAsync(employerId))
            .ReturnsAsync(() => employerWorkers);

        var jobRolesExtended = new List<JobRoleExtended>
        {
            new JobRoleExtended
            {
                EmployerWorkerId = employerWorkerId,
                BookedStartDate = DateTime.UtcNow,
                BookedEndDate = DateTime.UtcNow.AddDays(1),
                Id = 5,
                JobId = 8,
                Name = "Job 5",
                PayrollId = 10,
                PayrollName = "Conduct"
            }
        };

        _jobClientMock
            .Setup(client => client.GetJobRoleExtendedByEmployerWorkerIdsAsync(employerWorkers.Select(ew => ew.Id), null, null, null))
            .ReturnsAsync(() => jobRolesExtended);
    }
私有只读EmployerWorkerEngine\u EmployerWorkerEngine;
私有只读Mock_employeerWorkers客户端Mock;
私有只读Mock_jobClientMock;
公共工作者筛选测试()
{
_employerWorkersClientMock=new Mock();
_jobClientMock=新Mock();
_employerWorkerEngine=新employerWorkerEngine(_EmployerWorkerClientMock.Object,_jobClientMock.Object,);
}
[理论]
[在线数据(1)]
公共异步任务GetFilteredWorkersByEmployerIdSuccessSimple(int employerId)
{
//安排
const int employerworkerrid=3;
var gridState=new gridState{Skip=0,Take=1};
var employerWorkers=new List{new EmployerWorker{EmployerId=1,WorkerId=2,Id=employerWorkerId};
_employerWorkersClientMock.Setup(client=>client.GetEmployerWorkersByEmployerIdAsync(employerId))
.ReturnsAsync(()=>员工);
var jobRolesExtended=新列表
{
新职位扩展
{
EmployerWorkerId=EmployerWorkerId,
BookedStartDate=DateTime.UtcNow,
BookedEndDate=DateTime.UtcNow.AddDays(1),
Id=5,
JobId=8,
Name=“作业5”,
PayrollId=10,
PayrollName=“行为”
}
};
_jobClientMock
.Setup(client=>client.getJobRoleExtendedByEmployerWorkerRidAsync(employerWorkers.Select(ew=>ew.Id),null,null,null))
.ReturnsAsync(()=>jobRoleExtended);
}
因此,在测试期间,以下方法返回空集合: _jobsClient.getJobRoleExtendedByEmployerWorkerRidAsync()我不明白为什么。 我假设它与生成linq Select的集合的引用有关,但即使在这种情况下,我也不知道如何处理它进行测试

有人能帮我吗?

这有帮助吗:

_jobClientMock.Setup(client => client.GetJobRoleExtendedByEmployerWorkerIdsAsync(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())
        .ReturnsAsync(() => jobRolesExtended);
\u jobClientMock.Setup(client=>client.getjobroleextendedbyemployerworkerridsasync(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny())
.ReturnsAsync(()=>jobRoleExtended);
(一定要检查我的类型是否正确)

如果是这种情况,那么您的参数会丢失一些内容。

这是否有帮助:

_jobClientMock.Setup(client => client.GetJobRoleExtendedByEmployerWorkerIdsAsync(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())
        .ReturnsAsync(() => jobRolesExtended);
\u jobClientMock.Setup(client=>client.getjobroleextendedbyemployerworkerridsasync(It.IsAny()、It.IsAny()、It.IsAny()、It.IsAny())
.ReturnsAsync(()=>jobRoleExtended);
(一定要检查我的类型是否正确)


如果是这种情况,那么您的参数会丢失一些内容。

对于Moq,您必须正确设置期望值,否则调用模拟时将不匹配,因此无法按预期执行

在测试的方法中,您有

int? payrollId = null;
int? jobRoleId = null;
DateTime? bookedStart = null;

List<JobRoleExtended> jobRoles = 
    (await _jobsClient.GetJobRoleExtendedByEmployerWorkerIdsAsync(
        employerWorkers.Select(ew => ew.Id), payrollId, jobRoleId, bookedStart)
    )
    .ToList();

使用Moq时,您必须正确设置期望值,否则调用模拟时将不匹配,因此无法按预期执行

在测试的方法中,您有

int? payrollId = null;
int? jobRoleId = null;
DateTime? bookedStart = null;

List<JobRoleExtended> jobRoles = 
    (await _jobsClient.GetJobRoleExtendedByEmployerWorkerIdsAsync(
        employerWorkers.Select(ew => ew.Id), payrollId, jobRoleId, bookedStart)
    )
    .ToList();

顺便说一句:如果你有
var employerWorkers=wait\u employerWorkers客户端.getemployerworkerbyemployeridasync(employerId);
为什么要在
客户端.getjobroleextendedbyeemployerworkerridasync
employerWorkers.select(ew=>ew.Id)中进行另一次选择
?我假设您的
EmployeerWorkers
就是那个ID的人。而且
GetJobRoleExtendedByeEmployeerWorkerIDASync
是否期望一个数组/列表之类的东西?在我通过它的情况下。我无法处理几种情况,使用不同的输入参数来扩展单元测试以测试不同的部分。我同意,但是t对于第一种情况,您可以查看列表是否正确填写。您能确认这是一种情况吗?是的,当然。IsAny就是这种情况,谢谢。但我想得到答案,为什么选择在这种情况下不起作用,以及如果有不同的参考问题如何处理?我的错误,即使IsAny不能正常工作,返回空的YBTW:如果您有
var employerWorkers=wait\u employerWorkers client.getemployerworkerbyemployeridasync(employerId);
为什么要在
client.getjobRoleExtendedByeEmployerWorkerIDasync
中进行另一次选择?与
employerWorkers.select(ew=>ew.Id)
?我假设您的
EmployeerWorkers
就是那个ID的人。而且
GetJobRoleExtendedByeEmployeerWorkerIDASync
是否期望一个数组/列表之类的东西?在我通过它的情况下。我无法处理几种情况,使用不同的输入参数来扩展单元测试以测试不同的部分。我同意,但是t对于第一个案例,您可以查看列表是否正确填写。您能确认这是一个案例吗?是的,当然,是的。我就是这样,谢谢。但我想知道为什么选择在这种情况下不起作用,以及是否有其他参考