Mit einem Mock für eine Schnittstelle.
Sagen Sie Ihre Klasse ImplClass
haben, welche die Schnittstelle Finder
und Sie verwendet wollen sicherstellen, dass die Search
Funktion mit dem Argument „Hallo“ genannt wird;
so haben wir:
public interface Finder
{
public string Search(string arg);
}
und
public class ImplClass
{
public ImplClass(Finder finder)
{
...
}
public void doStuff();
}
Dann können Sie ein Modell für Ihren Testcode schreiben
private class FinderMock : Finder
{
public int numTimesCalled = 0;
string expected;
public FinderMock(string expected)
{
this.expected = expected;
}
public string Search(string arg)
{
numTimesCalled++;
Assert.AreEqual(expected, arg);
}
}
dann der Testcode:
FinderMock mock = new FinderMock("hello");
ImplClass impl = new ImplClass(mock);
impl.doStuff();
Assert.AreEqual(1, mock.numTimesCalled);
Funktioniert das, wenn Calc nicht abstrakt oder Schnittstelle ist? Soweit ich weiß, machen 'Moq' dynamische Proxies, damit ihre Mocks keine neuen IL-Anweisungen generieren, damit dies möglich ist ... – kuskmen