用最小起订量模拟 UnitOfWork/GenericRepository

Mocking UnitOfWork/GenericRepository with Moq

我 运行 遇到一个问题,其中最小起订量不 return 我使用以下代码所期望的:

[TestMethod]
public void GetResultReturnsAResult()
{
    var mockUnitOfWork = Arrange();
    // Arrange
    var controller = new ResultsController(mockUnitOfWork.Object);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.GetResult(2);

    // Assert
    Assert.IsTrue(response is OkNegotiatedContentResult<Result>);
    var contentResult = response as OkNegotiatedContentResult<Result>;
    Assert.IsNotNull(contentResult);
    Assert.IsNotNull(contentResult.Content);
    Assert.IsTrue(contentResult.Content.ID == 2);
}

[TestMethod]
public void GetResultReturnsNotFound()
{
    var mockUnitOfWork = Arrange();

    // Arrange
    var controller = new ResultsController(mockUnitOfWork.Object);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.GetResult(100);

    // Assert
    Assert.IsTrue(response is NotFoundResult);
    var contentResult = response as NotFoundResult;
    Assert.IsNotNull(contentResult);
}

private Mock<IUnitOfWork> Arrange()
{
    var results = new List<Result>()
    {
        new Result()
        {
            ID = 1,
            Name = "Result 1",
            Modified = new DateTime(2017, 1, 1),
            Created = new DateTime(2017, 1, 1),
            CreatedBy = "Tester 1",
            ModifiedBy = "Tester 2"
        },
        new Result()
        {
            ID = 2,
            Name = "Result 2",
            Modified = new DateTime(2017, 1, 2),
            Created = new DateTime(2017, 1, 2),
            CreatedBy = "Tester 1",
            ModifiedBy = "Tester 2"
        },
    };

    var mockUnitOfWork = new Mock<IUnitOfWork>();
    var mockResultRepository = new Mock<IGenericRepository<Result>>();

    mockResultRepository.Setup(x => x.Get(null, null, ""))
        .Returns(results);
    mockResultRepository.Setup(x => x.GetById(It.IsAny<int>()))
        .Returns((int id) => GetById(results, id));
    mockUnitOfWork.Setup(x => x.ResultRepository)
        .Returns(mockResultRepository.Object);

    return mockUnitOfWork;
}

private Result GetById(List<Result> results, int id)
{
    return results.FirstOrDefault(r => r.ID == id);
}

在这种情况下,我的 TestMethods 测试 GetById 都抛出异常消息:'System.Object[]' 类型的对象无法转换为 'System.Int32' 类型。

当我将模拟代码更改为:

mockResultRepository.Setup(x => x.Get(null, null, ""))
    .Returns(results);
mockUnitOfWork.Setup(x => x.ResultRepository)
    .Returns(mockResultRepository.Object);
mockUnitOfWork.Setup(x => x.ResultRepository.GetById(It.IsAny<int>()))
    .Returns((int id) => GetById(results, id));

GetById 测试不会抛出异常,但 GetResultReturnsAResult 不会 return 结果,所以它总是失败。

任何人都可以阐明这种行为吗?

正如 Eugene Podskal 在评论中所建议的那样,我在解决方案中创建了一个 MCVE (download here) 和 运行。事实上,他是正确的,解决方案是在未首先共享的代码中找到的。

返回

的代码
Object of type 'System.Object[]' cannot be converted to type 'System.Int32' 

exception 在抛出这个异常时是正确的,因为

GetById

需要一个

params object[]

作为第一个参数。