2014-02-26 8 views
8

Ich bin in letzter Zeit sehr interessiert an Tests geworden und ich versuche jetzt zu lernen, Unit-Tests in der bestmöglichen Weise zu tun. Ich benutze NUnit zusammen mit Rhino Mocks. Ich habe auch viel hier bei Stackoverflow gelesen, konnte aber keine klare Antwort auf meine Frage finden. Wenn ich eine Methode wie die folgende habe, sollte ich die OfficeClass-Abhängigkeit spotten und auch GetAllOffices testen oder nur einen Stub für die Abhängigkeit verwenden und verifizieren, dass die Methode GetAllOffices aufgerufen wurde und dass ich die tatsächlich bekomme Büros zurück, die ich von meinem Setup für den Stub erwartet habe?Stub vs Mock wenn Unit-Test

public Offices GetAllOffices() 
{ 
    try 
    { 
     var offices = officeClass.GetAllOffices(); 
     return offices; 
    } 
} 

Wird es einen Unterschied, ob die OfficeClass nur ein weiterer POCO ist oder wenn es lassen wird sagen, ein Web-Service in sence vs Anstoßen von spöttischen?

Lange Frage kurz: Wann zu verspotten und wann in Unit-Tests zu stottern?

+0

Ich habe gelesen dieser Beitrag früher, aber ich bin mir immer noch nicht sicher, wann ich den einen über den anderen benutzen soll und deshalb dachte ich, es würde helfen, etwas Input in den contex zu bekommen t meines eigenen Codes. –

+0

Nicht sicher, was fehlt Ihnen in der Post - alles ist da. Es listet alle Unterschiede zwischen diesen beiden Begriffen auf. – BartoszKP

+0

Ich habe immer noch das Gefühl, dass ich eine Antwort auf die Frage "wann zu verspotten und wann stottern in Unit-Tests?" Habe Ich denke, ich habe den Unterschied zwischen den beiden erkannt, aber nicht wann ich sollte verspotten und wann ich sollte stub ein Objekt im Rahmen des Komponententests. –

Antwort

11

Mocks verwenden ein Framework, um einen "Mock" Ihrer Abhängigkeit zu generieren. Wenn beispielsweise officeClass ein Repository für Ihre Daten ist, können Sie ein Mock-Framework (ich verwende MOQ) verwenden, um eine Kopie Ihres Repositorys zu erstellen. Aus diesem Grund ist die Verwendung von Schnittstellen für Ihre Abhängigkeit ideal zum Testen. Das spöttische Framework kann sich leicht eine Testoberfläche vortäuschen.

Mit Stubs, wie ich es verstehe, Sie manuell Ihre Abhängigkeit ausstellen und vordefinierte Antworten erstellen. Wenn Sie zum Beispiel eine Schnittstelle IOfficeClass haben und eine neue Klasse erstellen, die von ihr erbt, können Sie diese Klasse in Ihren Dienst einfügen, damit Sie sie verwenden können.

Wiederum sollten Dinge wie Web-Services in eine Schnittstelle eingebettet werden (wie das IRepository-Muster), mit der Sie Ihre Logik einfach testen können, ohne den Web-Service zu benutzen. Das Gleiche gilt für POCO-Klassen.

So zum Beispiel in Ihrem Fall würden Sie haben:

public interface IOfficeRepository 
{ 
    IQueryable<Office> GetAll(); 
} 

Und für Ihren Dienst

public class MyOfficeService 
{ 
    private readonly IOfficeRepository officeRepostiory; 

    public MyOfficeService(IOfficeRepository repository) 
    { 
     this.officeRepostiory = repository; 
    } 

    public Office GetOffice(int id) 
    { 
     return this.officeRepostiory.GetAll().SingleOrDefault(o => o.Id == id); 
    } 
} 

Auf diese Weise können Sie auch ohne Ihre Hauptanwendung oder Unternehmen die zugrunde liegende Datenquelle ändern zu ändern Logikcode.

Ihr Gerät zu testen wäre so etwas wie dieses mit moq aussehen:

[TestClass] 
public class OfficeUnitTest 
{ 
    private MyOfficeService service; 

    [TestInitialize] 
    public void Setup() 
    { 
     var officeRepository = new Mock<IOfficeRepository>(); 

     var office = new List<Office>(); 
     office.Add(new Office{ Id = 1 }); 

     officeRepository.Setup(m => m.GetAll()).Returns(office.AsQueryable()); 

     this.service = new MyOfficeService(officeRepository.Object); 
    } 

    [TestMethod] 
    public void TestGetById() 
    { 
     Assert.IsNotNull(service.GetOffice(1)); 

     // my mock will never return a value for 2 
     Assert.IsNull(service.GetOffice(2)); 
    } 
} 

Sie können unter mehr über Mocks und Stubs lesen:

http://martinfowler.com/articles/mocksArentStubs.html

http://msdn.microsoft.com/en-us/library/ff649690.aspx

+0

Ich denke, der _martinfowler_ one ist eine schöne Erklärung dieser vier Bedeutungen von ** Dummy **, ** Fake **, ** Stubs ** und ** Mocks **. Vielen Dank. –

Verwandte Themen