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
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. –
Nicht sicher, was fehlt Ihnen in der Post - alles ist da. Es listet alle Unterschiede zwischen diesen beiden Begriffen auf. – BartoszKP
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. –