【问题标题】:XUnit Create Operation Service Mock FailureXUnit 创建操作服务模拟失败
【发布时间】:2020-10-29 10:48:59
【问题描述】:

我试图在类构造函数中像这样模拟我的服务的创建方法:

serviceMock.Setup(p => p.AddClinic(GetTestClinicModel()))
                .Returns(GetTestClinic());

模拟模型和模拟实体

private CreateClinicBindingModel GetTestClinicModel()
{
    return new CreateClinicBindingModel()
    {
        Name = "Clinic-3"
    };
}

private Clinic GetTestClinic()
{
    return new Clinic()
    {
        Id = 3,
        Name = "Clinic-3"
    };
}

测试方法

[Fact]
public void Add_ValidObjectPassed_ReturnsCreatedResponse()
{
    // Act
    var createdResponse = controller.Add(GetTestClinicModel());
    // Assert
    Assert.IsType<CreatedAtActionResult>(createdResponse);
}

控制器添加方法

[HttpPost("create")]
public IActionResult Add(CreateClinicBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest();
    }
    var entity = _service.AddClinic(model);
    return Created(entity);
}

所以我的问题是测试失败,当我调试 _service.AddClinic() 方法时它返回 null。

模拟服务未返回预期的实体(诊所)。

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    问题是设置需要在调用 GetTestClinicModel() 时创建特定实例。

    但是,当再次调用 GetTestClinicModel() 时,会创建一个全新的实例,因此在执行测试时不会使用相同的实例。

    因此,mock 将返回 null,因为存在单独的实例。

    考虑更改设置以使用参数匹配器,例如 It.Is&lt;T&gt;()

    serviceMock
        .Setup(_ => _.AddClinic(It.Is<CreateClinicBindingModel>(m => m.Name == "Clinic-3")))
        .Returns(GetTestClinic());
    

    上面的设置告诉模拟当它获得一个匹配提供的谓词的实例时,它的行为与预期一样

    【讨论】:

    • 好的,成功了。但实际上,我需要进一步澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2015-11-25
    • 1970-01-01
    • 2015-04-01
    • 2020-06-29
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多