XUnit创建操作服务模拟失败

时间:2020-10-29 10:48:59

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

我正在尝试在类构造函数中模拟服务的create方法:

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。

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

我该如何解决?

1 个答案:

答案 0 :(得分:0)

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

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

由于存在单独的实例,因此该模拟将返回null。

考虑将设置更改为使用It.Is<T>()之类的参数匹配器

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

上述设置告诉模拟程序在获得与提供的谓词匹配的实例时表现出预期的行为