Pisałem test jednostkowy na fragmencie kodu, który zwrócił JSON. Typ, który zwraca, jest typem anonimowym, więc pomyślałem, że aby zweryfikować wartości, po prostu rzuciłem obiekt na a, dynamic
aby wykonać moje asercje.
Jednak kiedy to robię, moja kompilacja kończy się niepowodzeniem, ale nie mam żadnych komunikatów o błędach. Udało mi się to odtworzyć za pomocą bardzo prostego kodu w nowym projekcie testów jednostkowych:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
Poniżej znajduje się zrzut ekranu przedstawiający niepowodzenie kompilacji
Kompilacja powiedzie się, gdy skomentuję to stwierdzenie:
Z drugiej strony uruchomiłem następujący kod w LinqPad 5 beta (który używa kompilatora Roslyn) i nie miałem żadnych problemów:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
Prawdziwe
Co tu się dzieje? Ponieważ błąd się nie wyświetla, nie mogę stwierdzić, czy używamdynamic
nieprawidłowo, czy nie mogę znaleźć przeciążenia do użycia z IsTrue()
powodu dynamic
, lub czy jest to błąd w kompilatorze (chociaż bardzo w to wątpię , Nie mam żadnych dowodów na to, że coś jest nie tak z moim kodem).
Jeśli chodzi o problem z przeciążeniem, próbowałem Assert.IsTrue((bool)asDynamic.someValue);
ale kompilacja nadal się nie udaje, nadal nie ma komunikatu o błędzie.
Zgodnie z komentarzem @ RonBeyera, próbowałem też rzucić więcej, takich jak poniżej, ale bezskutecznie:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
Po dokładniejszym zbadaniu stwierdziłem, że w oknie Wyjście wystąpił błąd:
c: ... \ DynamicBuildFailTest \ UnitTest1.cs (16,33,16,42): błąd CS0656: brak wymaganego elementu członkowskiego kompilatora „Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
Okej, VS2013 lepiej radzi sobie z raportowaniem błędów, wyszukam na podstawie tych:
Okay, dodanie odwołania do Microsoft.CSharp naprawiło błąd kompilacji , ale zostawię to pytanie otwarte, ponieważ prawdopodobnie jest to problem z VS2015, który (moim zdaniem) powinien zostać rozwiązany.
dynamic asDynamic = (dynamic)obj;
? Lub po prostu w Asercji, skomentuj dynamikę i napisz Assert.IsTrue(((dynamic)obj).someValue);
.
Assert.IsTrue((bool)asDynamic.someValue);
?