c# - 如何测试异步任务返回 IEnumerable在 xunit 中使用最小起订量?
问题描述
我想测试我的控制器的 GetMoviesAsync。我不知道我在 Moq 设置中做错了什么。我从 GetMoviesAsync 获得 0 个项目。
我究竟做错了什么?
// API 控制器:
public interface ICommand
{
Task<IEnumerable<Movie>> GetMoviesAsync();
}
public class SampleController : ControllerBase
{
private readonly ICommand movieCommand;
public SampleController(ICommand command)
{
movieCommand = command;
}
[HttpGet]
public async Task<IActionResult> GetMoviesAsync()
{
var movies = await movieCommand.GetMoviesAsync();
return Ok(movies);
}
}
// 单元测试:
public class SampleControllerTest
{
private IEnumerable<Movie> MovieList()
{
IList<Movie> movies = new List<Movie>()
{
new Movie()
{
ID =1,
Title = "Test",
ReleaseDate = DateTime.Now,
RunningTimeInMinutes = 100
}
};
return movies;
}
private SampleController GetSampleController()
{
var command = new Mock<ICommand>();
return new SampleController(command.Object);
}
[Fact]
public async Task GetMovies_Test()
{
// Arrange
var controller = GetSampleController();
var commadMock = new Mock<ICommand>();
// How to setup moq here?
commadMock.Setup(s => s.GetMoviesAsync()).Returns(Task.FromResult<IEnumerable<Movie>>(MovieList())).Verifiable();
// Act
var response = await controller.GetMoviesAsync() as OkObjectResult;
// Problem is here,
var li=response.Value as IEnumerable<Movie>;
}
}
解决方案
我究竟做错了什么?
正在使用两个完全不同的模拟。
一个用于创建控制器
private SampleController GetSampleController()
{
var command = new Mock<ICommand>();
return new SampleController(command.Object);
}
另一个正在测试中创建和设置。
var controller = GetSampleController();
var commadMock = new Mock<ICommand>();
// How to setup moq here?
commadMock.Setup(s => s.GetMoviesAsync()).Returns(Task.FromResult<IEnumerable<Movie>>(MovieList())).Verifiable();
要解决此问题,请使用相同的模拟来获得所需的行为
[Fact]
public async Task GetMovies_Test() {
// Arrange
var commadMock = new Mock<ICommand>();
var controller = new SampleController(commadMock.Object); //<---
commadMock
.Setup(_ => _.GetMoviesAsync())
.ReturnsAsync(MovieList())
.Verifiable();
// Act
var response = await controller.GetMoviesAsync() as OkObjectResult;
//Assert
var list = response.Value as IEnumerable<Movie>;
//...
}
注意ReturnsAsync
设置返回的使用Task
推荐阅读
- ruby-on-rails - 如何仅使用我的 params 白名单方法在 Rails 中创建具有深度嵌套关联的模型对象?
- gradle - 如何将 Gradle 插件应用于自身?
- javascript - 如何计算从添加的不同行中选择的下拉列表中的 1 个选项并显示在文本框中?
- java - 构造函数是突变体吗?
- oracle11g - oracle触发器以防止插入操作
- excel - 如果数据之间有空白单元格,如何使用 Rows.Count 函数
- java - Java 正则表达式匹配器模式不断返回 false
- javascript - 使用以数组为键的 JavaScript Map,为什么我无法获取存储的值?
- javascript - Javascript 模块导入的神秘错误消息
- git - 创建 Github 存储库并仅通过 git 推送文件