Я писал модульный тест для кода, который возвращал JSON. Тип, который он возвращает, является анонимным, поэтому я подумал, что для проверки значений в нем я просто приведу объект к a, dynamic
чтобы сделать свои утверждения.
Однако, когда я делаю это, моя сборка завершается неудачно, но у меня нет сообщений об ошибках. Мне удалось воспроизвести это с очень простым кодом в новом проекте модульного тестирования:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Ниже приведен скриншот ошибки сборки
Сборка завершается успешно, когда я закомментирую утверждение:
Напротив, я запустил следующий код в бета-версии LinqPad 5 (которая использует компилятор Roslyn), и у меня не было проблем:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Правда
Что тут происходит? Так как ошибка не отображается, я не могу сказать, dynamic
правильно ли я использую , или не могу найти перегрузку для использования IsTrue()
из-за dynamic
, или это ошибка в компиляторе (хотя я очень сомневаюсь в этом У меня нет никаких доказательств того, что с моим кодом что-то не так).
Что касается проблемы с перегрузкой, я попытался, Assert.IsTrue((bool)asDynamic.someValue);
но сборка все равно не удалась, все еще нет сообщения об ошибке.
В соответствии с комментарием @ RonBeyer, я также пробовал больше кастингов, таких как ниже, но безрезультатно:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
При ближайшем рассмотрении я обнаружил, что в окне вывода отображается ошибка:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): ошибка CS0656: отсутствует требуемый для компилятора член 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Хорошо, VS2013 лучше сообщает об ошибках, я буду искать на основе этих:
Хорошо, добавление ссылки на Microsoft.CSharp исправило ошибку сборки , но я оставлю этот вопрос открытым, потому что это, вероятно, проблема с VS2015, которая (на мой взгляд) должна быть решена.
dynamic asDynamic = (dynamic)obj;
? Или просто в утверждении закомментируйте динамику и напишите Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?