Как преобразовать OkObjectResult в список <>? - PullRequest
0 голосов
/ 07 августа 2020

В настоящее время пишется модульный тест, чтобы проверить, что он возвращает правильный тип объекта

[Fact]
    public async Task GetVenue_Should_Return_GetVenueType()
    {
        var venues = new[]
        {
            new VenueTypeResponse()
            {
                id = 1,
                Name = "Cafe",
                ImageUrl = "Cafe.png"
            },
            new VenueTypeResponse()
            {
                id = 2,
                Name = "Takeaway",
                ImageUrl = "Takeaway.png"
            }
        };

        mockedVenueService.Setup(x => x.GetVenueType()).Returns(Task.FromResult(new List<VenueTypeResponse>(venues)));

        var controller = new VenueController(mockedVenueService.Object, mockedCafeService.Object, mockedCafeRequestValidator.Object);

        var result = await controller.GetVenueType() as OkObjectResult;
        var data = result.Value as List<VenueTypeResponse>; //errors here: outputs null
                  
        Assert.IsType<OkObjectResult>(result);

        Assert.Collection(data, x => Assert.Contains("Cafe", x.Name),
                                x => Assert.Contains("Takeaway", x.Name));
        Assert.Collection(data, x => Assert.Contains("Cafe.png", x.ImageUrl),
                                x => Assert.Contains("Takeaway.png", x.ImageUrl));

        Assert.Equal(StatusCodes.Status200OK, result.StatusCode);
        
    }

, когда я пытаюсь преобразовать OkObjectResult в переменную данных, он просто выводит null?

Я что-то не так в процессе преобразования?

Реализация GetVenueType ()

    [HttpGet]
    [Route("venue-type")]
    [ProducesResponseType(typeof(VenueTypeResponse), 200)]
    [ProducesResponseType(401)]
    public async Task<IActionResult> GetVenueType()
    {
        var result = new VersionResponse()
        {
            Data = await _venueService.GetVenueType()

        };
        return Ok(result);
    }

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вы имеете в виду, что не можете получить List <> из OkObjectResult? Вот демонстрация получения списка из OkObjectResult:

TestController:

public async Task<IActionResult> GetVenueType()
        {
            List<Spray> sprays = new List<Spray> { new Spray { Id = 1, Name = "product1", Price = 10, Quantity = 1, Total = 1, Image = "image1.png" }, new Spray { Id = 2, Name = "product2", Price = 20, Quantity = 1, Total = 20, Image = "Image2.png" } };
            return Ok(sprays);
        }
        public ActionResult TestOK() {
        IActionResult result = new TestController().GetVenueType().Result;
        var data = result as OkObjectResult;
        List<Spray> sprays = (List<Spray>)data.Value;
        List<Spray> ss = sprays.Where(s => s.Name.Contains("product1")).ToList<Spray>();

        return Ok(ss);
    }

результат: введите описание изображения здесь

0 голосов
/ 07 августа 2020

Проблема в вашем кастинге. Вы возвращаете OkObjectResult из VersionResponse в своем контроллере, но пытаетесь преобразовать его в List<VenueTypeResponse>.

В вашем методе тестирования вы должны использовать Value от result до VersionResponse, вот так:

 var data = result.Value as VersionResponse;

, и вы должны изменить утверждения на:

Assert.Collection(data.Data, x => Assert.Contains("Cafe", x.Name),
    x => Assert.Contains("Takeaway", x.Name));
Assert.Collection(data.Data, x => Assert.Contains("Cafe.png", x.ImageUrl),
    x => Assert.Contains("Takeaway.png", x.Data.ImageUrl));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...