如何对返回ToList的动作进行单元测试

时间:2020-01-05 19:02:01

标签: c# unit-testing asp.net-core asp.net-core-mvc

您好,我正在尝试为此Controller方法运行一些测试,但是我正在努力测试View,这是我的控制器类。

public class StockController : Controller
{
    private readonly IStockService _stockService;

    public StockController(IStockService stockService)
    {
        _stockService = stockService;
    }

    // GET: Stock
    public async Task<IActionResult> Index()
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        IEnumerable<StockDto> stocks = null;
        try
        {
            stocks = await _stockService.GetStockAsync();
        }
        catch (HttpRequestException)
        {
            stocks = Array.Empty<StockDto>();
        }
        return View(stocks.ToList());
    }
}

这是用于股票控制器的MS测试项目上的测试方法,我已经完成了 Arrange Act 的工作,但是对于 Asserts 'ViewResult'上有一条红线,我不确定为什么。

[TestMethod]
public async Task ReturnIndexMethod()
{
    //Arrange
    var controller = new StockController(new FakeStockService());
    //Act
    var result = await controller.Index(); 
    //Assert
    Assert.IsNotNull(result);
    var AResult = result as ViewResult;
    Assert.IsNotNull(AResult);
    var stockResult = AResult.Value as IEnumerable<StockDto>;
    Assert.IsNotNull(stockResult);

}

这里还有FakeStockService,它将提供模拟测试数据,以防万一人们需要查看它。

public class FakeStockService : IStockService
{
    private readonly IEnumerable<StockDto> _stock = new List<StockDto>
    {
        new StockDto { Id = 1, Name = "asfdaf", Description = "afsdfsfdsda", Price = 5000 }
    };

    public Task<IEnumerable<StockDto>> GetStockAsync()
    {
        return Task.FromResult(_stock);
    }
}

任何帮助或建议都将不胜感激,尝试了所有其他功能后,我在这里茫然无措。

1 个答案:

答案 0 :(得分:0)

也许测试缺少命名空间以便访问该ViewResult类型。

using Microsoft.AspNetCore.Mvc;
//...

此外,除非是错字,否则查看结果应该具有Model属性,而不是像您那里那样的Value属性。

[TestMethod]
public async Task ReturnIndexMethod()
{
    //Arrange
    var controller = new StockController(new FakeStockService());

    //Act
    var result = await controller.Index(); 

    //Assert
    Assert.IsNotNull(result);
    var view = result as ViewResult;
    Assert.IsNotNull(view);
    var stockResult = view.Model as IEnumerable<StockDto>;
    Assert.IsNotNull(stockResult);
}

测试中的其他所有内容对我来说都很好。

但是,控制器操作似乎正在访问GET请求上的模型状态。所示的当前示例并不需要使用模型状态,因此我建议将其删除

public async Task<IActionResult> Index() {
    IEnumerable<StockDto> stocks = null;
    try {
        stocks = await _stockService.GetStockAsync();
    }
    catch (HttpRequestException) {
        stocks = Array.Empty<StockDto>();
    }
    return View(stocks.ToList());
}