Ungültige Einstellung auf eine nicht-virtuelle member mit MOQ
Ich bin moqing eine Schnittstelle, die hat:
Dictionary<string, object> InstanceVariables { get; set; }
Habe ich einen neuen mock von der Oberfläche und versuchen, es so einrichten, es gibt nur einen zufälligen string der in etwa so:
_mockContext.SetupGet(m => m.InstanceVariables[It.IsAny<string>()]).Returns(@"c:\users\randomplace");
Aber ich glaube, ich bekomme eine Fehlermeldung:
{"Invalid setup on a non-virtual (overridable in VB) member: m => m.InstanceVariables[It.IsAny<String>()]"}
Was bedeutet das genau? Ich bin lustig das interface, so sollte dies nicht ein problem sein?
Dank
- Warum brauchen Sie, um ein mock
Dictionary
wenn Sie erstellen ein Wörterbuch wird Sie alle erforderlichen Felder aus? - Weil ich was ändern will kommt aus InstanceVariables, wenn ich ausführen, die Methode, die ich übergeben habe in meinem mockContext Objekt in
- Ihre Immobilie ist ein
Dictionary
, nicht einIDictionary
. Aus diesem Grund machen Sie es kompilieren müssen Sie verspotten die konkrete Umsetzung, nicht die Schnittstelle, wie Sie behaupten (obwohl ich kann nicht wissen, dass für sicher, da Sie nicht posten, dass der code). Also, der Fehler ist richtig - man kann Sie nicht überschreiben nicht-virtueller Mitglied (und das Wörterbuch indexer ist nicht im virtuellen). Allerdings, @Valentin die Frage steht immer noch - warum nicht erstellen Sie einfach ein dictionary mit den Werten, wie Sie wünschen für Ihre unit-test - ein Wörterbuch ist ein dummer Daten-speichern - es besteht keine Möglichkeit, es zu verspotten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Reihe von Gründen würde ich davon abraten. Erstens, wie bereits erwähnt, in den Kommentaren gibt es keinen Grund, warum ein real-Wörterbuch wäre nicht hier arbeiten. Wir sollten nicht spotten Typen, dass das, was wir nicht besitzen und nur mock-Typen, die wir selbst tun.
Die Linie
_mockContext.SetupGet(m => m.InstanceVariables[It.IsAny<string>()]).Returns(@"c:\users\randomplace");
versucht zu verspotten, dieGet
aufDictionary<T, T>
die als @RB Notizen nichtvirtual
, daher dein Fehler. Sie können mocking Ihre - Schnittstelle, aber der Satz da oben ist auf der .NET Wörterbuch.Zweitens, IMO,
It.IsAny<string>()
führt zu ganz schwachen tests, weil Sie zu reagieren, sowie, eine beliebige Zeichenfolge. Strukturierung so etwas wie:wird stärker sein als das Wörterbuch kann nur reagieren mit dem Pfad, wenn der richtige Schlüssel ist gegeben /sind oder durch Sie generiert Ihr System Under Test (sut).
Sagte, dass, wenn Sie müssen absolut mock ein Wörterbuch, aus Gründen, die nicht offensichtlich auf die Frage... dann das Grundstück, auf Ihre Schnittstelle muss die Schnittstelle für das Wörterbuch
IDictionary
, nicht die konkrete Klasse:Dann können Sie das Wörterbuch mock über:
Dann auf den Kontext mock:
Warum muss es virtuell sein?
Dictionary<,>
ist in der Tat nicht-virtuellen, finden Sie unter dessen Dokumentation. Zu sehen, dass die SchnittstelleIDictionary<,>
umfasst die Mitglied (indexer), siehe Ihre Seite. Ich Stimme vollkommen zu, dass es wahrscheinlich am besten erstellen Sie ein standard-besiedeltenDictionary<,>
im test, und, dass die Rückkehr aus dem mock. Doch im zweiten Ansatz, den Sie nicht haben, um das setupIt.IsAny<string>()
. Sie können das setup-Menü nurd => d["someKey"]
wenn Sie wollen.