首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xunit测试ActionResult

Xunit测试ActionResult
EN

Stack Overflow用户
提问于 2020-04-29 01:22:42
回答 1查看 184关注 0票数 0

我正在尝试使用Xunit和moq编写一个单元测试,它将从client.GetAll()返回一个数据。在我调试client.GetAll的时候,它只返回null。

代码语言:javascript
复制
    This is my controller class

    private readonly IClient _client;
    public EventsController(IClient client)
    {
        _client = client;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<EventDTO>>> List()
    {
        var values = await _client.GetAll();

        return Ok(values);
    }

我正在使用我的客户端代码实现。我不确定是不是IOptions导致了这个问题

代码语言:javascript
复制
  public class Client: IClient
  {
    public RestClient RestClient { get; set; }
    public IOptions<MySettings>Settings { get; set; }
    public Client(IOptions<MySettings>options)
    {
        Settings = options;
        RestClient = new RestClient(options.Value.BaseUrl);
    }

    public async Task<List<EventDTO>> GetAll()
    {
        var request = new RestRequest(Settings.Value.GetAll, Method.GET);
        var content = await RestClient.GetAsync<RootObject>(request);

        var data = content.Events.SelectMany(con =>
            con.Geometries.Select(geo =>
                new EventDTO
                {
                    Title = con.Title,
                    Id = con.Sources.FirstOrDefault()?.Id,
                    CategoriesTitle = con.Categories.FirstOrDefault()?.Title,
                    DateTime = geo.Date
                })
        ).ToList();

        return data;
    }

这是我的测试类。我注意到,当我调试它时,它没有进入_client.GetAll()方法。这是因为我没有正确设置IOptionsoptions吗?

代码语言:javascript
复制
public class EventsControllerTests
   {
    private readonly EventsController _controller;
    private readonly Mock<IClient> _clientService;
    public EventsControllerTests()
    {
        _clientService = new Mock<IClient>();
        _controller = new EventsController(_clientService.Object)
        {
            ControllerContext = new ControllerContext
            {
                HttpContext = new DefaultHttpContext()
            }
        };
    }

    [Fact]
    public async Task Should_return_events_from_configured_service()
    {
        var response = new RootObject();
        {
            new Event()
            {
                Id = "sadsadsa"
            };
        };

        var s = _clientService.Setup(x => x.Get(It.IsAny<string>())).ReturnsAsync(response);

        var controllerResponse = await _controller.List();

        var responseBody = controllerResponse.Value as IEnumerable<EventDTO>;
    }

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 03:59:53

您应该从控制器中单独测试GetAll方法。在控制器中,你可以模拟你的客户端。

代码语言:javascript
复制
public class EventsControllerTests
{
    private readonly Mock<IClient> _clientMock;
    private readonly EventsController _testeeController;

    public EventsControllerTests()
    {
        _clientMock = new Mock<IClient>();
        _testeeController = new EventsController(_clientMock.Object);
    }

    [Fact]
    public async Task ListTest()
    {
        var dtoList = new List<EventDto>{new EventDto(), new EventDto()};
        _clientMock.Setup(c => c.GetAll()).ReturnsAsync(dtoList);

        var response = await _testeeController.List();
        var jsonResult = (JsonResult) response.Result;
        var dtoListFromResponse = (IEnumerable<EventDto>) jsonResult.Value;

        // compare dtoListFromResponse with dtoList
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61486180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档