【问题标题】:Unit testing using Nunit gives an error使用 Nunit 进行单元测试会出错
【发布时间】:2017-04-04 10:30:55
【问题描述】:

我刚开始在我的 WebApi 项目中使用 Nunit 进行单元测试。

我为我的控制器开发了一个测试用例:

private readonly INewsBusinessLogic _newsBusinessLogic;

[Test] 
public async Task GetAllNews()
{
   // Arrange
   var controller = new NewsController(_newsBusinessLogic);

   controller.Configuration = new System.Web.Http.HttpConfiguration();
   controller.Request = new System.Net.Http.HttpRequestMessage();

    // Act
    var actionResult = await controller.Get(); 

   //assert
   Assert.IsNotNull(actionResult);
}

API 控制器:

public class NewsController : ApiController 
{  
    private readonly INewsBusinessLogic _newsBusinessLogic;

    public NewsController(INewsBusinessLogic newsBusinessLogic)
    {
        _newsBusinessLogic = newsBusinessLogic;
    }

    public async Task<IHttpActionResult> Get()
    {
       return Ok(await _newsBusinessLogic.GetNewsUpdates());
    }
}

当我调试我的测试时,它在 Act 上给了我一个 NullReferenceException 的错误,我非常清楚 What is a NullReferenceException?。但无法弄清楚,为什么会发生这种情况以及如何解决它。

旁注:我没有使用任何 ORM。

【问题讨论】:

  • 首先,您将null 变量传递给NewsController 构造函数,因为您没有在示例中显示将值分配给_newsBusinessLogic
  • 你误会了。在测试中,您没有为变量赋值,因此它为空

标签: asp.net-mvc unit-testing asp.net-web-api nunit asp.net-web-api2


【解决方案1】:

首先,您将null 变量传递给NewsController 构造函数,因为您没有在示例中显示将值分配给_newsBusinessLogic

这是一个使用Moq 的示例,说明如何模拟控制器的依赖项

[Test] 
public async Task GetAllNews()
{
   // Arrange
   var newsBusinessLogicMock = new Mock<INewsBusinessLogic>();
   newsBusinessLogicMock
      .Setup(m => m.GetNewsUpdates())
      .ReturnsAsync("{your desired return here}");

   var controller = new NewsController(newsBusinessLogicMock.Object);

   controller.Configuration = new System.Web.Http.HttpConfiguration();
   controller.Request = new System.Net.Http.HttpRequestMessage();

    // Act
    var actionResult = await controller.Get(); 

   //assert
   Assert.IsNotNull(actionResult);
}

【讨论】:

  • 谢谢!,错误消失了,但是actionResult得到空结果,你能告诉我可能的原因吗?
  • 你在测试安排中为ReturnsAsync设置了什么?
  • 我已将List&lt;NewsUpdatesSharedModel&gt; 设置为.ReturnsAsync(new List&lt;NewsUpdatesSharedModel&gt;());
  • 只是为了确认。 GetNewsUpdates 是异步方法吗?
  • 那是因为测试在模拟界面。它不会影响您的实际 BL 和 DAL。它是一个模拟。接口的预期实现的伪造。如果目标是调用实际的实现,那么这个单元测试就会变成一个集成测试。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多