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

时间:2017-10-06 06:52:25

标签: c# linq select moq xunit

我为引擎实现单元测试,并在存储库mock中设置2种不同的方法。所以第一个效果很好,但是当我做linq选择第二个它返回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
    }

此后我的单元测试班

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

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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

这有帮助:

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

(检查我的类型是否正确)

如果是这种情况,那么你的参数就丢失了。

答案 1 :(得分:1)

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

在测试方法中,您有

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 ID

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