2015-09-01 49 views
1

我想重構一個Asp.Net MVC單頁應用程序。 WebApi曾經是服務層,但由於一些身份驗證問題,我不得不將其更改爲直接引用。 WebApi項目有UnitTests,但MVC應用程序沒有。如何模擬一個webapi控制器,該控制器的操作返回任務<IHttpActionResult>使用Moq

我正在努力嘲笑[使用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操作?

+0

是否建議.ReturnsAsync <>工作? –

回答

0

假設你的API名字是FooApi,你要測試的控制器被稱爲FooController的您的單元測試可能看起來類似這樣的內容:

[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); 
} 

的對象Result代表你的控制器的ActionResult的典型。例如:

return this.View("index", new Result());