XUnit 创建操作服务模拟失败

XUnit Create Operation Service Mock Failure

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

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() 方法时它 return 为空。

模拟服务不是 return 预期的实体(诊所)。

我该如何解决这个问题?

问题是安装程序需要调用 GetTestClinicModel() 时创建的特定实例。

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

因此模拟将 return 为 null,因为有单独的实例。

考虑更改设置以使用像 It.Is<T>()

这样的参数匹配器
serviceMock
    .Setup(_ => _.AddClinic(It.Is<CreateClinicBindingModel>(m => m.Name == "Clinic-3")))
    .Returns(GetTestClinic());

以上设置告诉 mock 在获得与提供的谓词匹配的实例时按预期行为