Как я могу получить данные внутри возвращаемого JsonResult в моем UnitTest?

У меня есть метод контроллера, который возвращает JsonResult следующим образом:

    public ActionResult GetZipByState(string stateId)
    {
        var result =
            _mediator.Send<List<ZipCodeModel>>(new ZipCodeByStateQuery()
            {
                StateId = stateId
            });

        return Json(new { ZipCodes = result }, JsonRequestBehavior.AllowGet);
    }

Затем у меня есть этот модульный тест:

    [Fact]
    public void GetZipByState_CanGetZipCodesByStateId()
    {
        // Arrange
        _mockMediator.Setup(m => m.Send<List<ZipCodeModel>>(It.Is<ZipCodeByStateQuery>(plist => plist.StateId == "VA")))
           .Returns(new List<ZipCodeModel>()
           {
                new ZipCodeModel(){ ZipCodeId = "7690", ZipCode = "24210" },
                new ZipCodeModel(){ ZipCodeId = "7691", ZipCode = "24211" },
                new ZipCodeModel(){ ZipCodeId = "7692", ZipCode = "24212" }
           });

        // Act
        //var actual = _controller.GetZipByState("VA");
        JsonResult actual = _controller.GetZipByState("VA") as JsonResult;
        List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>;

        // Assert
        Assert.Equal("24211", (dynamic)actual.Data);
    }

Я вижу данные, которые мне нужно получить, в моем Json в разделе:

фактический.Data.ZipCodes[1] на этом снимке экрана:

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

Но когда я пытаюсь поместить фактические данные в результирующую переменную, а затем выполнить утверждение, мне сообщается, что результат равен нулю.

Как вы должны это сделать?


person Sam    schedule 02.11.2017    source источник
comment
Вы не можете просто привести данные jsonresult к любому типу. Вам нужно использовать сериализатор json, чтобы десериализовать его в объект целевого типа.   -  person Chetan Ranpariya    schedule 02.11.2017
comment
Похоже, здесь то же самое. https://stackoverflow.com/questions/25875658/converting-jsonresult-into-a-other-object-in-c-sharp   -  person Cedar    schedule 02.11.2017
comment
Взгляните на этот ответ, который я дал на аналогичный вопрос stackoverflow.com/a/38446754/5233410   -  person Nkosi    schedule 02.11.2017


Ответы (1)


Ваша проблема в том, что вы используете неправильный тип.

Эта строка здесь: List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>; должна быть изменена на

var result = actual.Data.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.FirstOrDefault(x => x.Name == "ZipCodes")
.GetValue(actual.Data) as List<ZipCodeModel>;
person zaitsman    schedule 02.11.2017