C# Mock Unitof Work/GenericRepository和Moq

C# Mock Unitof Work/GenericRepository和Moq,c#,unit-testing,moq,C#,Unit Testing,Moq,我遇到了一个问题,Moq没有使用以下代码返回我期望的内容: [TestMethod] public void GetResultReturnsAResult() { var mockUnitOfWork = Arrange(); // Arrange var controller = new ResultsController(mockUnitOfWork.Object); controller.Request = new HttpRequestMessage()

我遇到了一个问题,Moq没有使用以下代码返回我期望的内容:

[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);
}
[TestMethod]
public void getResultReturnsResult()
{
var mockUnitOfWork=Arrange();
//安排
var控制器=新的结果控制器(mockUnitOfWork.Object);
controller.Request=new-HttpRequestMessage();
controller.Configuration=新的HttpConfiguration();
//表演
var响应=控制器.GetResult(2);
//断言
IsTrue(响应为OkNegotiatedContentResult);
var contentResult=响应为OkNegotiatedContentResult;
Assert.IsNotNull(contentResult);
Assert.IsNotNull(contentResult.Content);
Assert.IsTrue(contentResult.Content.ID==2);
}
[测试方法]
public void GetResultReturnsNotFound()
{
var mockUnitOfWork=Arrange();
//安排
var控制器=新的结果控制器(mockUnitOfWork.Object);
controller.Request=new-HttpRequestMessage();
controller.Configuration=新的HttpConfiguration();
//表演
var响应=控制器.GetResult(100);
//断言
IsTrue(响应为NotFoundResult);
var contentResult=响应为NotFoundResult;
Assert.IsNotNull(contentResult);
}
私人模拟办公室()
{
var results=新列表()
{
新结果()
{
ID=1,
Name=“结果1”,
修改=新日期时间(2017年1月1日),
已创建=新日期时间(2017,1,1),
CreatedBy=“Tester 1”,
ModifiedBy=“测试仪2”
},
新结果()
{
ID=2,
Name=“结果2”,
修改=新日期时间(2017年1月2日),
已创建=新日期时间(2017年1月2日),
CreatedBy=“Tester 1”,
ModifiedBy=“测试仪2”
},
};
var mockUnitOfWork=new Mock();
var mockresultpository=new Mock();
mockResultPository.Setup(x=>x.Get(null,null,“”)
.回报(结果);
mockresultepository.Setup(x=>x.GetById(It.IsAny())
.Returns((int id)=>GetById(results,id));
mockUnitOfWork.Setup(x=>x.ResultRepository)
.Returns(mockresultpository.Object);
返还劳动报酬;
}
私有结果GetById(列表结果,int id)
{
返回results.FirstOrDefault(r=>r.ID==ID);
}
在本例中,测试GetById的TestMethods都会抛出一个异常消息:类型为“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));
mockresultpository.Setup(x=>x.Get(null,null,”))
.回报(结果);
mockUnitOfWork.Setup(x=>x.ResultRepository)
.Returns(mockresultpository.Object);
mockUnitOfWork.Setup(x=>x.ResultRepository.GetById(It.IsAny())
.Returns((int id)=>GetById(results,id));
GetById测试不会引发异常,但GetResultReturnsResult不会返回结果,因此它总是失败


有人能解释一下这种行为吗?

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

返回

Object of type 'System.Object[]' cannot be converted to type 'System.Int32' 
异常在引发此异常时是正确的,因为

GetById
需要

params object[]

作为第一个参数。

我建议您创建一个,因为提供的大多数代码与问题无关,而实际需要的部分可能缺少。我的意思是在没有ASP特定内容的情况下复制问题,并在实际的unittest中只保留最小值,以便任何人都可以运行它并获得与您获得的结果相同的结果。
mockUnitOfWork.Setup(x=>x.resultRespository.GetById(it.IsAny())。返回((int-id)=>GetById(results,id))
应该可以工作,为了能够找到问题的根源,请添加
控制器的实现。GetResult