【问题标题】:Why is the result from this controller action null?为什么此控制器操作的结果为空?
【发布时间】:2017-07-19 16:07:41
【问题描述】:

我正在从头开始一个新项目。目前我正在设计一些元素并尝试尽早实施单元测试。问题是,由于控制器操作的响应似乎为空,单元测试失败了。在监视窗口中,actionResult 显示“表达式求值器中的内部错误”,contentResult 为空。

我该如何解决这个问题?

xunit 2.2.0.3545,最小起订量 4.7.63.0

这里是单元测试(xunit):

// Used in the unit tests
private List<City> cities = new List<City>
{
 new City { City_Name = "Chicago", City_Code = 1 },
 new City { City_Name = "New York", City_Code = 2 },
 new City { City_Name = "Seattle", City_Code = 3 }
};

[Fact]
public async Task Get_AllCities_PropertiesArePopulated()
{
    // Arrange
    var mockService = new Mock<ICityService>();
    mockService.Setup(x => x.GetCities()).ReturnsAsync(this.cities);

    var controller = new CityController(mockService.Object);

    // Act
    IHttpActionResult actionResult = await controller.GetCities();
    var contentResult = actionResult as OkNegotiatedContentResult<List<City>>;

    foreach (var city in contentResult.Content)
    {
        // doesn't get here due to .Content being null.
    }
}

这是我的控制器:

public class CityController : ApiController
{
    private readonly ICityService cityService;

    public CityController(ICityService svc)
    {
        this.cityService = svc;
    }

    public async Task<IHttpActionResult> GetCities()
    {
        var cities = await this.cityService.GetCities();

        if (!cities.Any())
        {
            return this.BadRequest();
        }

        return this.Ok(cities);
    }
}

服务接口:

public interface ICityService
{
    Task<IEnumerable<City>> GetCities();
}

【问题讨论】:

  • 尝试在actionResult 上调用.Result,因为GetCities 返回Task&lt;T&gt;
  • @Kyle - actionResult,Status = RanToCompletion,Result = "System.Web.Http.Results.OkNegotiatedContentResult1[System.Collections.Generic.IEnumerable1[X.Y.Z.Entities.City]]"。这看起来是正确的,但 contentResult 仍然为空。
  • @DenaliHardtail 那是因为你投射到错误的类型

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


【解决方案1】:

GetCities返回IEnumerable&lt;City&gt;

Task<IEnumerable<City>> GetCities();

但在测试的转换中,您使用 List&lt;City&gt; 将其转换为错误的类型

var contentResult = actionResult as OkNegotiatedContentResult<List<City>>;

什么时候应该使用IEnumerable&lt;City&gt;

var contentResult = actionResult as OkNegotiatedContentResult<IEnumerable<City>>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多