Frage

So habe ich die folgende Klasse:

public class MyClass {
  internal void A() {
    foreach(Thing thing in ThingArray)
      B(thing);
  }

  virtual internal void B(Thing thing)
  {
    //  do some stuff
  }
}

Und dann habe ich den folgenden Test:

...
var testObject = new Mock<MyClass>(parameters);
testObject.Setup(t => t.B(It.IsAny<Thing>()));

test.Object.A();

test.Verify(t => t.B(It.IsAny<Thing>()), Times.Exactly(2));

Und das überprüfen versagt. Ich habe überprüft, und der Code ruft den real B () -Methode zu einer verspottet B () Methode gegenüber.

Ich habe eine Menge Code bekam laufen, wo Moq perfekt funktioniert, und ich habe genug Codierung lange zu erkennen, dass ich etwas falsch hier tun muß, sondern für das Leben von mir, ich kann es nicht sehen. Ich habe unter der Annahme vorangekommen, dass da ich rufe Test. Object .A (), die Anrufe zu B () nicht durch die Mock gehen, aber das wirklich macht keine Sinn für mich, da einen Anruf von einem anderen Objekt würde die gleiche Arbeit ...

Also, warum auf der Erde ist nicht die nachgeahmten Setup ausgeführt werden?

Edit: Ja, ich habe die Interna sichtbar für das Testprojekt. Ich meinte, dass in der ursprünglichen Nachricht zu bringen, da ich jemand wusste, dass es erwähnen.

Wie der realen Code ist es leider sehr proprietär, also kann ich es nicht posten. Ich werde sehen, ob ich den Code morgen einstellen kann, um es tatsächlich kompilieren zu machen.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob Gamlor Antwort funktioniert. Es scheint, dass, wenn Sie ein Setup auf einem Verfahren durchgeführt werden soll, wenn Sie überprüfen möchten, dass Class1.MethodA ruft Class1.MethodB, MethodB (was derjenige ist, dass Sie das Setup tun würde) öffentlich sein muss (unabhängig von InternalsVisibleTo). Ich schrieb einen einfachen Test unter einer ähnlichen Situation und stellte fest, dass, wenn ich meine MethodB öffentlich gemacht, Moq zu arbeiten begann. Ich würde wetten, wenn Sie Ihre Methode B öffentlich gemacht, dass es funktionieren würde.

Ich nehme an, das ein Schloss oder Moq Fehler ist, aber ich weiß es nicht genau. Hoffentlich wird jemand läuten.

Ich weiß MethodB öffentlich zu machen, ist keine gute Wahl. Aber das ist, was ich über die Situation weiß ...

Andere Tipps

Das Objekt Ihre Mock diese Kriterien erfüllen, um zu treffen hat eine erfolgreich eine Methode spotten:

  • Es hat eine Schnittstelle sein
  • Oder die Methode, die Sie verspotten wollen hat eine virtuelle Methode und die Öffentlichkeit sein.

Sie können nun auch virtuelle interne Methode spotten, aber um zu ermöglichen, dass Sie Moq Zugriff auf Interna geben. Dies können Sie tun, mit:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

Das die internen zugänglich, um den Code-Generator von Moq machen.

Also, um Ihre MyClass.A zu verspotten rufen Sie haben, dies zu tun:

  1. Stellen Sie die Methode eine virtuelle.
  2. Und Ihre Methode öffentlich machen oder den Zugriff erlauben mit

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    

Oder wie gesagt, eine Schnittstelle machen, die die API von MyClass darstellt.

Moq nicht wickeln Sie den vorhandenen Code, sondern erstellt eine leere Mock.

Das bedeutet, dass testObject.Object.A () aufrufen nicht Ihren ursprünglichen Code ausführen, so wird B nie genannt.

Wenn Sie so tun, als Ihre spöttischen eine Schnittstelle dann dies macht Sinn, weil Schnittstellen keinen Code hat, so weder würde das Mock.

Versuchen Sie, die Mock wie diese zu schaffen (ich habe es nicht versuchen, damit ich weiß nicht, ob es funktioniert):

var testObject= new Mock<MyClass> { CallBase = true };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top