我正在尝试重构Asp.Net MVC单页应用程序。 WebApi曾经是服务层,但由于身份验证的一些问题,我不得不将其更改为直接引用。 WebApi项目有UnitTests,但MVC应用程序没有。
我正在努力模拟[使用Moq] WebApi返回的Task<IHttpActionResult>
类型。
我的ApiController看起来像这样:
public async Task<IHttpActionResult> Post(MyModel myModel)
{
.......
return Ok(result);
}
在我的MVC控制器中,我在一个动作中使用它:
[HttpPost]
public async Task<ActionResult> Post(MyViewModel myViewModel)
{
...
....
var resultFromApiController = await myApiController.Post(myViewModel.model);
....
}
如何测试MVC控制器的Post Action?
答案 0 :(得分:0)
假设您的API名称是FooApi,而您正在测试的Controller被称为FooController,您的UnitTest可能看起来像这样:
[Test]
public void TestMethod()
{
// Arrange
var apiMock = new Mock<IFooApi>();
apiMock.Setup(api => api.Post(It.IsAny<MyModel>())).ReturnsAsync(new OkNegotiatedContentResult<Result>(new Result(), new FooApi()));
// Act
var testObject = new FooController(apiMock.Object);
var viewResult = testObject.Post(new MyViewModel()).Result as ViewResult;
var result = (Result)viewResult.Model;
// Assert
Assert.AreEqual(2, result.Product);
}
[Test]
public void TestMethod()
{
// Arrange
var apiMock = new Mock<IFooApi>();
apiMock.Setup(api => api.Post(It.IsAny<MyModel>())).ReturnsAsync(new OkNegotiatedContentResult<Result>(new Result(), new FooApi()));
// Act
var testObject = new FooController(apiMock.Object);
var viewResult = testObject.Post(new MyViewModel()).Result as ViewResult;
var result = (Result)viewResult.Model;
// Assert
Assert.AreEqual(2, result.Product);
}
对象表示Controller的ActionResult的类型。例如:
Result