Ich habe eine Klasse A
, die eine Methode auf der Schnittstelle B
aufruft und eine ihrer eigenen Methoden als eine Art Fortsetzung weiterleitet B
soll aufrufen, wenn es ein Ergebnis hat. Der Code scheint in der Praxis gut zu funktionieren, aber ich kann nicht herausfinden, wie man es mit Moq testet - wenn ich das Offensichtliche versuche, produziert es System.ArgumentException : method argument length mismatch
. zuerst dachte, es könnte meinen Code sein, aber es funktioniert nicht auf die gleiche Weise mit dem folgenden Spielzeugkoffer:Moq: Überprüfen, ob eine Methode mit einem bestimmten Delegaten aufgerufen wurde, erzeugt "method argument length mismatch"
public class A
{
readonly B myB;
public A (B b)
{
myB = b;
}
public void HandleC (C c)
{
// do something
}
public void DoFindC()
{
myB.FindC (HandleC);
}
}
public interface B
{
// Finds a C and then passes it to handleC
void FindC (Action<C> handleC);
}
public interface C
{
}
[TestFixture()]
public class ATest
{
[Test()]
public void TestDoFindC()
{
Mock<B> bMock = new Mock<B>();
A a = new A(bMock.Object);
a.DoFindC();
bMock.Verify(b => b.FindC(a.HandleC));
}
}
Ich vermute, einige hinter den Kulissen gibt es Magie mit Delegierten, die ich noch nicht verstehen, relativ neu in C#, aber was ist der richtige Weg dies zu testen?
Update: Als Referenz Ich bin mit Mono 2.6.7 auf MacOS 10.6.5 und Targeting .NET 3.5.
Aktualisiert wieder: beste Vermutung ist, dass dies ein Mono Fehler ist; Ich habe es als https://bugzilla.novell.com/show_bug.cgi?id=656918 abgelegt.
Ich habe nur Ihren Code kopiert und der Test bestanden. Ich benutze xUnit, aber das wäre nicht wichtig. Verwenden Sie die neueste Version von Moq? –
Ich benutze Moq 4.0.10827 - scheint immer noch die neueste Version zu sein. Vielleicht ist es ein Mono-Bug? Ich benutze Mono 2.6.7 und targetiere .NET 3.5, wenn das einen Unterschied machen könnte. Ich sehe keine NUnit-Klassen im Stack-Trace, also ist es wahrscheinlich nicht NUnit vs xUnit. –
Ich habe gerade den Test erneut ausgeführt, der auf .NET 3.5 abzielte und es bestanden hat. An dieser Stelle würde ich sagen, dass es ein Problem mit Mono ist. –