C# 使用Linq Select时不是预期的结果
我为引擎实现了单元测试,并在存储库模拟中设置了两种不同的方法。第一个很好,但是当我为第二个执行linq Select时,它返回0,而我设置了返回特定对象。 我在引擎中的代码: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
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对于第一个案例,您可以查看列表是否正确填写。您能确认这是一个案例吗?是的,当然,是的。我就是这样,谢谢。但我想知道为什么选择在这种情况下不起作用,以及是否有其他参考