2017-10-06 114 views
0

我对引擎执行了单元测试,并在存储库模拟中设置了两种不同的方法。所以第一个工作正常,但是当我做linq选择第二个它返回0,而我没有设置返回特定的对象。 我的引擎代码:使用Linq时没有预期的结果选择

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 
    } 

和将来我的单元测试类

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); 
    } 

所以,测试下面的方法时返回空集: _jobsClient.GetJobRoleExtendedByEmployerWorkerIdsAsync(),我不知道为什么。 我假设它与生成linq Select的集合的引用有关,但即使在这种情况下,我也不知道如何处理它以进行测试。

有人可以帮我吗?

回答

1

这是否帮助:

_jobClientMock.Setup(client => client.GetJobRoleExtendedByEmployerWorkerIdsAsync(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()) 
     .ReturnsAsync(() => jobRolesExtended); 

(做检查,如果我得到的各类右)

,如果是这样的话,那么你失去了一些东西与你的参数。

+0

顺便说一句:如果你有'VAR employerWorkers =等待_employerWorkersClient.GetEmployerWorkersByEmployerIdAsync(employerId);'你为什么要另做选择在用'employerWorkers.Select(ew => ew.Id)''client.GetJobRoleExtendedByEmployerWorkerIdsAsync'中?我假设你的“雇主工作者”是那个有这个ID的人。并且'GetJobRoleExtendedByEmployerWorkerIdsAsync'需要一个数组/列表还是什么? –

+0

在我通过It.IsAny 的情况下,我将无法处理多个使用不同输入参数扩展单元测试以测试不同部分的情况。 – mustf4

+0

我同意,但对于第一种情况,您可以查看列表是否已正确填写。你能证实这种情况吗? –

1

随着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(); 

Select声明似乎是返回ID的集合(IEnumerable<int>),你已经正确配置了第一个电话。

现在需要第二次调用正确配置,以期望为int的该集合IDS

_jobClientMock 
    .Setup(_ => _.GetJobRoleExtendedByEmployerWorkerIdsAsync(
        It.IsAny<IEnumerable<int>>(), 
        null, 
        null, 
        null) 
    ) 
    .ReturnsAsync(() => jobRolesExtended);