如何使用Moq模拟具有返回Task <ihttpactionresult>的操作的webapi控制器

时间:2015-09-01 19:46:50

标签: c# asp.net-mvc unit-testing asp.net-web-api moq

我正在尝试重构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?

1 个答案:

答案 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