如何模拟 post 请求?

How to mock a post request?

控制器:

private IBeer _beerService;

public BeerController(IBeer beerService)
{
    _beerService = beerService;
}

[HttpPost]
public async Task<IActionResult> Post([FromBody]Beer model)
{
     if (!ModelState.IsValid)
     {
          return BadRequest(ModelState);
     }
     var beer = await _beerService.Add(model);
     return Ok(CreatedAtAction("Add Item", new { beer.id }, beer));
}

型号:

public class Beer
    {
        public int id { get; set; }
        public string name { get; set; }
        public int cost { get; set; }
    }

接口:

public interface IBeer
    {
        Task<Beer> Add(Beer beer);
    }

测试:

[Fact]
        public void TestPostWithMock()
        {
            // Arrange
            var serviceMock = new Mock<IBeer>();
            List<Beer> expected = new List<Beer>()
            {
                new Beer{id=2, beer="Kingfisher", cost=170 },
            };
            serviceMock.Setup(x => x.Add(expected)).Returns(() => Task.FromResult(beer));
            var controller = new BeerController(serviceMock.Object);

            // Act
            var result = controller.Get(2);

            // Assert
            var okResult = result.Should().BeOfType<OkObjectResult>().Subject;
            var actual = okResult.Value.Should().BeAssignableTo<IEnumerable<Beer>>().Subject;

            Assert.Equal(expected, actual);
        }

我正在尝试模拟 post 请求,但是当我在这里尝试模拟它时:

x => x.Add(expected) 

它给我一个错误 - Generic.list 无法转换为 Controller.Beer。应该怎么办?

如错误描述所述,您在设置服务时将啤酒列表 (List<Beer>) 发送到 Add() 方法。您应该改为发送 Beer class 实例(就像在您的界面中一样)作为参数,如下所示。

// Update your request object without List 
var expected = new  Beer()  
    {
        id=2,
        beer="Kingfisher",
        cost=170
     };

另外,更新您的设置函数如下。

serviceMock.Setup(x => x.Add(expected)).Returns(() => Task.FromResult(expected));

最后,您需要像在控制器中那样从 controller.Post() 方法获取结果,而不是从 controller.Get(2) 获取结果。希望对你有帮助。