c# - 如何在 xunit 中使用最小起订量测试返回 IEnumerable<model> 的异步任务<IActionResult>?

标签 c# asp.net-core asp.net-core-webapi moq xunit

我想测试我的 Controller 的 GetMoviesAsync。我不知道我的最小起订量设置哪里做错了。我从 GetMoviesAsync 获得 0 项。

我做错了什么?

//API Controller :

   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>;
         }
    }

最佳答案

What am I doing wrong?

正在使用两个完全不同的模拟。

一个用于创建 Controller

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

关于c# - 如何在 xunit 中使用最小起订量测试返回 IEnumerable<model> 的异步任务<IActionResult>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54007508/

相关文章:

c# - OpenGL ES 2.0/MonoTouch : Texture is colorized red

c# - 如何对返回 void 的 DAO 更新/删除方法进行单元测试?

c# - 如何将字符串列表(已经在单独的 json 数据中)转换为单个 json 数组导致 c#?

C# CS0019 IntPtr

C#方法行程序

c# - 从 SqlServer 到 C#

asp.net MVC6 实现 tagbuilder 类并在 ".ToString"上出现错误

c# - 建议使用 webapplicationbuilder.configuration 而不是 configureappconfiguration

authentication - ASP.Net Core 2.2 SignInManager 'No sign-in authentication handler is registered for the scheme ' Identity.Application'

web-config - 通过配置添加 AuthorizationHandler