如何模拟 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)
获取结果。希望对你有帮助。
控制器:
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)
获取结果。希望对你有帮助。