2016-06-10 10 views
1

Wenn ich dem testgetriebenen Entwicklungszyklus folgen soll, muss ich zuerst den Test schreiben und dann den Code schreiben. Aber dann, wenn ich die folgende Klasse haben:TDD-Code zum Erzwingen einer langsamen Initialisierung

public class ServiceProvider : IServiceProvider 
{ 
    private readonly IService1 service1; 
    private readonly IService2 service2; 
    ... 

    public ServiceProvider() 
    { 
     service1 = new Service1(); 
     service2 = new Service2(); 
     ... 
    } 

    public IService1 Service1 { get { return service1; } } 
    public IService2 Service2 { get { return service2; } } 
    ... 
} 

und einen Test, der nur überprüft, ob die zurückgegebenen Instanzen sind nicht null:

[TestFixture] 
public class ServiceProviderTest 
{ 
    [Test] 
    public void ServicesAreNotNull() 
    { 
     var serviceProviderUT = new ServiceProvider(); 

     Assert.That(serviceProviderUT.Service1, Is.Not.Null); 
     Assert.That(serviceProviderUT.Service2, Is.Not.Null); 
     ... 
    } 
} 

wie kann ich schreiben einen Test, der mich zwingt, aus zu gehen diese Klasse zum folgenden?

public class ServiceProvider : IServiceProvider 
{ 
    private readonly Lazy<IService1> service1; 
    private readonly Lazy<IService2> service2; 
    ... 

    public ServiceProvider() 
    { 
     service1 = new Lazy<IService1>(() => new Service1()); 
     service2 = new Lazy<IService2>(() => new Service2()); 
     ... 
    } 

    public IService1 Service1 { get { return service1.Value; } } 
    public IService2 Service2 { get { return service2.Value; } } 
    ... 
} 

Antwort

2

Ihr Test sollte Sie nicht zu einer bestimmten Implementierung zwingen. Es erwartet ein bestimmtes Verhalten. Für einen Komponententest ist Ihr Code eine Blackbox. Wenn das Verhalten korrekt ist, ist der Test erfolgreich. In diesem Fall ist die Implementierung der Dienste privat, daher sollte sich Ihr Test nicht darum kümmern, wie er implementiert wird. Wenn die Schnittstelle einer Klasse nicht geändert wird, sollten Sie dieselben Unittests durchführen. Die faule Initialisierung ist mehr ein Codeüberprüfungselement.

+0

Vielen Dank für Ihre Antwort, aber Sie sprechen über Verhalten, so frage ich mich, ob Ihre Antwort mehr über BDD und nicht TDD (Ich bin immer noch versucht, die Unterschiede zwischen ihnen zu finden). Wollen Sie sagen, dass es keinen Sinn hat zu testen, ob eine Variable initialisiert wurde oder nicht? – Charlie

+0

Nun, in einigen Fällen ** ** willst du vielleicht überprüfen, ob etwas lazur gemacht wurde. Beispiel könnte prüfen, ob 'yield return' verwendet wird. –

+0

BDD ist eine andere Sache. BDD ist über die Spezifikation in einer bestimmten Form. Gegeben ... Wenn ... Als ... Wir testen keine privaten Daten in TDD, weil wir nicht auf Implementierungsdetails angewiesen sein wollen. – ntohl

Verwandte Themen