【问题标题】:Moq setup returns null object when the method is called by a UnitTest当 UnitTest 调用该方法时,Moq 设置返回空对象
【发布时间】:2019-11-07 05:53:16
【问题描述】:

测试设置

当测试命中控制器内部的方法时,Mock 给出 null 对象

我的控制器的构造函数有两个我模拟的依赖项。在为 CheckOut 运行测试时,它在结果中给出了 null 对象。我正在使用 AutoMapper 在模型对象和业务之间进行映射

[Fact]
public void CheckOutSomethingsTest()
{
    Mock<ICheckoutService> checkoutServiceMock = new Mock<ICheckoutService>();
    Mock<IMapper> mapperMock = new Mock<IMapper>();

    checkoutServiceMock.Setup(c => c.CheckoutSomethings(new CheckOutSomethingsInput
    {
        SecretKey = "SecureKey",
        UserId = 100,
        SomethingIds = new List<int> { 10001, 1002, 1003 }
    }))
    .Returns<List<CheckedOutSomething>>((o) => new List<CheckedOutSomething>
    {
            new CheckedOutSomething { Id = 10001, Remarks = "Success" },
            new CheckedOutSomething  { Id = 10002, Remarks = "Success" }
    });

    var configuration = new MapperConfiguration(cfg =>
    {
        cfg.AddSomething(new AutoMapperBusinessToEntitiesSomething());
        cfg.AddSomething(new AutoMapperModelsToBusinessSomething());
    });

    var mapper = new Mapper(configuration);
    var controller = new SomethingsController(checkoutServiceMock.Object, mapper);

    var result = controller.CheckOut(
        new CheckOutSomethingInputModel 
        { 
              UserId = 100, 
              SomethingIds = new List<int> { 10001, 10002, 10003 } 
        });

    Assert.IsType<OkObjectResult>(result.Result);
    Assert.Equal(2, result.Value.Count);
}

服务 构造函数

public ProfilesController(ICheckoutService checkoutService, IMapper mapper)
{
    this.checkoutService = checkoutService;
    this.mapper = mapper;            
}

方法

[HttpPost]
[Route("checkout")]
public ActionResult<List<CheckedOutSomethingModel>> 
        CheckOut([FromBody] CheckOutSomethingInputModel checkoutInput)
{       
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    } 

    var input = mapper.Map<CheckOutSomethingsInput>(checkoutInput);
    var output = mapper.Map<List<CheckedOutSomethingModel>> 
    (checkoutService.CheckoutSomethings(input));
    return Ok(output);
}

我不知道我做错了什么

【问题讨论】:

  • 您将模拟配置为仅在 CheckOutSomethingsInput 的某些实例作为参数提供时才返回给定对象。因为在运行时生产代码中提供的CheckOutSomethingsInput实例与配置的实例不同,所以mock会将方法调用视为未配置,并返回返回类型的默认值。
  • @Fa checkoutServiceMock.Setup(c => c.CheckoutProfiles(It.IsAny())) .Returns(new List { new CheckedOutProfile { Id = 10001, Remarks = "成功” },新 CheckedOutProfile { Id = 10002,备注 = “成功” } });是这样的吗
  • 这是一种方式。您可能希望进行另一个测试以检查是否通过了预期值。

标签: c# unit-testing asp.net-web-api2 moq xunit


【解决方案1】:

@Fabio 非常感谢是这样的吗

checkoutServiceMock.Setup(c => c.CheckoutSomethings(It.IsAny<CheckOutSomethingsInput>()))
                .Returns(new List<CheckedOutSomething>
            {
                new CheckedOutSomething { Id = 10001, Remarks = "Success" },
                new CheckedOutSomething { Id = 10002, Remarks = "Success" }
            });

我确实做到了,它成功了,再次感谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多