2017-12-15 4 views
1

die folgende Klasse Stellen Sie sich vor:Wie testet man eine Methode mit lokaler Instanz?

class ClassToBeTested{ 
    private IClassA a; 
    private IClassB b; 

    public ClassToBeTested(IclassA a, IClassB b) 
    { 
     this.a = a; 
     this.b = b; 
    } 

    public void MethodToBeTested() 
    { 
     //... 
     var c = new ClassC(a, b); 
     c.doSomeThing(); 
     //... 
    } 
} 

Und ich möchte für MethodToBeTested einige Unit-Tests zu tun. Aber ich kann keinen Weg zum moq ClassC Objekt finden, ohne Abhängigkeitsinjektion durchzuführen. Ich möchte die Methodensignatur nicht ändern und ClassC als Parameter übergeben.

Gibt es einen Weg zur Unit-Test diese Methode?

+0

Sie könnten eine virtuelle Methode erstellen, die einen 'ClassC' zurückgibt, und das wäre mockbar. Siehe [Testing the Un-Testable] (https://contrivedexample.com/2016/11/26/testing-the-un-testable/) – Crowcoder

+0

Sie können eine Property-Injection durchführen und eine Eigenschaft vom Typ 'ClassC' in yout' erstellen ClassToBeTested' –

+0

Verwenden Sie Abhängigkeitsinjektion, aber wenn Sie dies nicht tun möchten und Sie Zugriff auf VS Enterprise haben, können Sie Fälschungen und gefälschte ClassC und ihre Mitglieder verwenden. Dies ist praktisch, wenn Sie keine Versionskontrolle über einen Typ haben, der gerade verwendet wird. In Ihrem Fall würde ich jedoch DI empfehlen. Wenn Sie testen, und es ist nicht einfach wegen der eng gekoppelten Klassen, dann müssen Sie umgestalten, (der Test sagt Ihnen, dass Ihr Design ändern muss) – Igor

Antwort

1

Entweder injizieren in ClassC in oder wenn Sie davon abhängen, es zur Laufzeit zu erstellen, injizieren Sie in einer Art Factory sagen ClassCFactory dann können Sie stattdessen die Fabrik verspotten.

Verwandte Themen