2009-12-03 12 views

Antwort

10

Mehr Kontext ist erforderlich. Also werde ich ein hier setzen Moq in den Mix:

pubilc class Calc { 
    public int DoubleIt(string a) { 
     return ToInt(a)*2; 
    } 

    public virtual int ToInt(string s) { 
     return int.Parse(s); 
    } 
} 

// The test: 
var mock = new Mock<Calc>(); 
string parameterPassed = null; 
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s); 

mock.Object.DoubleIt("3"); 
Assert.AreEqual("3", parameterPassed); 
+0

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

11

Sie müssen ein spöttisches Framework verwenden, z. B. Typemock oder Rhino Mocks oder NMocks2.

NUnit hat auch eine Nunit.Mock, aber es ist nicht bekannt.

Die Syntax für moq kann here finden:

var mock = new Mock<ILoveThisFramework>(); 

// WOW! No record/reply weirdness?! :) 
mock.Setup(framework => framework.DownloadExists("2.0.0.0")) 
    .Returns(true) 
    .AtMostOnce(); 

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it... 
ILoveThisFramework lovable = mock.Object; 
bool download = lovable.DownloadExists("2.0.0.0"); 

// Verify that the given method was indeed called with the expected value 
mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 

Beachten Sie auch, dass Sie nurSchnittstelle spotten kann, also, wenn Ihr Objekt von System.IO.File keine Schnittstelle hat, dann können Sie wahrscheinlich‘ t do. Sie müssen Ihren Anruf an System.IO.File innerhalb Ihrer eigenen benutzerdefinierten Klasse für den Auftrag einbinden.

+2

NUnit führt nur Tests aus, es macht keine Spott oder Verifizierung. Verschiedene Verantwortlichkeiten. Sie sollten die Erwartungen an Ihr Mock-Objekt überprüfen können, obwohl ich Moq nicht verwendet habe. – kyoryu

+0

Yep ich schaute auf den falschen Platz ... Ich suchte in Nunit. jetzt schaue ich auf moq. :) –

+0

MOQ ermöglicht es Ihnen auch abstrakte Klassen zu verspotten. –

3

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); 
2

In Rhino Mocks, wo ist eine Methode namens AssertWasCalled

Hier ist eine Möglichkeit, es zu benutzen

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>(); 
 

 
var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager); 
 

 
mailHandler.NotifyPrinting(User, Info); 
 

 
mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());

Verwandte Themen