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



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

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测试项目的测试方法,我的安排行动工作正常,但是对于断言,"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);
}
}

任何帮助或建议将不胜感激,在尝试了其他所有内容后,我只是在这里不知所措。

也许测试缺少命名空间以访问该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());
}

最新更新