【问题标题】:Unit testing a Web API controller actualResult using moq does not behave as expected使用 moq 对 Web API 控制器实际结果进行单元测试的行为不符合预期
【发布时间】:2021-10-16 06:05:22
【问题描述】:

单元测试控制器返回IHttpActionResult 原因

System.NullReferenceException: '对象引用未设置为对象的实例。

[HttpGet]
public async Task<IHttpActionResult> Get(Guid myId)
{    
    var myaccount = await _myaccountService.GetMyAccount(myId);
    return Ok(myaccount);
}

在测试方法中的代码

var actualResult = (await controller.Get(It.IsAny<Guid>()) as OkNegotiatedContentResult<IEnumerable<MyAccount>>).Content;

返回

System.NullReferenceException: '对象引用未设置为对象的实例。**

[TestMethod]
public async Task GeMyAccount_Returns_CorrectData()
{
      // Arrange         
      var expectedResult = new List<MyAccount>
     {
         new  MyAccount
          {
           Id = "1",
           Name = "Name1"
          },
         new  MyAccount
          {
           Id = "2",
           Name = "Name2"
          },
     };

    //Act 
    var mockMyAccountService = new Mock<IMyAccountService>();
    mockMyAccountService.Setup(mock => 
    mock.GetMyAccount(It.IsAny<Guid>())).Returns(Task.FromResult(expectedResult));
    var controller = new MyAccountController(mockMyAccountService.Object);

     var actualResult = (await controller.Get(It.IsAny<Guid>()) as 
    OkNegotiatedContentResult<IEnumerable<MyAccount>>).Content;
    mockOnrAccountService.Verify(m => m.GetMyAccount(It.IsAny<Guid>()));
    Assert.AreEqual(expectedResult, actualResult);

不知道我做错了什么。

【问题讨论】:

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


    【解决方案1】:

    mockMyAccountService 中的 GetMyAccount 方法应为 List&lt;MyAccount&gt; 作为返回类型。由此,MyAccountControllerGet 方法也有望返回OkNegotiatedContentResult&lt;List&lt;MyAccount&gt;&gt; 类型而不是OkNegotiatedContentResult&lt;IEnumerable&lt;MyAccount&gt;&gt;。所以,问题出在你不正确的类型转换上。

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多