Как мне выполнить модульное тестирование действия, которое возвращает ToList - PullRequest
1 голос
/ 05 января 2020

Здравствуйте, я пытаюсь запустить некоторые тесты для этого метода контроллера, но я изо всех сил пытаюсь проверить представление, вот мой класс контроллера.

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 Test Project для контроллера запаса у меня есть 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 голосов
/ 06 января 2020

Возможно, в тесте отсутствует пространство имен для доступа к этому типу 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());
}
...