"динамическое" ключевое слово и данные JSON - PullRequest
8 голосов
/ 06 января 2011

Метод действия в моем приложении ASP.NET MVC2 возвращает объект JsonResult, и в моем модульном тесте я хотел бы проверить, что возвращенный объект JSON действительно содержит ожидаемые значения.

Я пробовал это:

1. dynamic json = ((JsonResult)myActionResult).Data;
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel);

Но я получаю RuntimeBinderException «объект» не содержит определения «ErrorLevel» ».

Однако, когда я помещаю точку останова в строку 2 и проверяю динамическую переменную json (см. Рисунок ниже), она, очевидно, содержит содержит строку ErrorLevel и имеет ожидаемое значение, поэтому, если связыватель времени выполнения не шутка, тест пройдёт.

Snapshot of the Locals debugger window

Что я не получаю? Что я делаю не так и как я могу это исправить? Как я могу пройти утверждение?

Ответы [ 2 ]

15 голосов
/ 06 января 2011

Тебе не нужна динамика. Вот пример. Предположим, вы выполнили следующее действие, которое хотели бы выполнить модульное тестирование:

public ActionResult Index()
{
    return Json(new { Id = 5, Foo = "bar" });
}

и соответствующий тест:

// act
var actual = subjectUnderTest.Index();

// assert
var data = new RouteValueDictionary(actual.Data);
Assert.AreEqual(5, data["Id"]);
Assert.AreEqual("bar", data["Foo"]);

Также вам может пригодиться следующая запись в блоге .

2 голосов
/ 06 января 2011

Свойство Data типа JsonResult имеет тип Object. Это означает, что, хотя у вас есть динамическое объявление, установленный тип по-прежнему Object. Другая проблема заключается в том, что вы используете анонимный тип в качестве Data, а затем пытаетесь получить к нему доступ как к объявленному экземпляру за пределами его применимой области. Используйте метод @ Darin для доступа к значениям свойств, используя RouteValueDictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...