Moq kann nicht erstellt mock-Objekt der Klasse mit nullable-parameter in den Konstruktor
Habe ich diese Klasse:
public class TestClass
{
public TestClass(int? foo, string bar)
{
//..Something
}
}
Ich versuche, mich zu verspotten, es mit MOQ wie diese
var mockA = new Mock<A>(new object[] {(int?)1, string.Empty})
oder so,
var mockA = new Mock<A>(new object[] {1 as int?, string.Empty})
selbst diese
var mockA = new Mock<A>(new object[] {(int?)null, string.Empty})
Wenn ich versuche mir das Objekt wie dieses
var objA = mockA.Object
wirft er diese exception
Kann nicht proxy instanziieren der Klasse: TestClass.
Konnte nicht finden einen Konstruktor, der würde mit angegebenen Argumenten:
System.Int32,
System.String
(für die Dritte wirft es null-Referenz-Ausnahme)
Wie man es erkennt, das erste argument vom Typ Nullable-System.Int32 und nicht das System.Int32.
(Bitte ignorieren, ich bin mocking eine Klasse und kein interface.)
- Hinweis: dieses Problem existiert nicht in Moq 4.0
Du musst angemeldet sein, um einen Kommentar abzugeben.
, um ein Mock-Objekt mit Moq, das Objekt selbst muss einepublic
leeren Konstruktor.Methoden, die Sie wollen, zu verspotten, muss
virtual
in Ordnung außer Kraft gesetzt werden.Edit:
Ich bin mit Moq v4.0.20926 (die neueste Version von NuGet) und die folgenden arbeiten:
Der Grund dafür ist, dass die Boxen einen nullable-Wert nicht wirklich die box
Nullable<T>
Wert, es Boxen die den Wert innerhalb.Grundsätzlich:
(int?)1
ist das gleiche wie eine boxed-version von1
Kann man sich den Boxen Bedienung so ähnlich wie diese:
In anderen Worten, Ihre
object[]
array nicht erhalten eine Kopie der nullable-Wert überhaupt, es wird nur eine Kopie derint
Wert, oder einnull
-Referenz, von denen keiner trägt dieNullable<T>
geben.Hier einige LINQPad code zu testen:
Ausgabe: