2017-03-03 6 views
0

Ich habe eine Schwierigkeitseinheit, die meine Klasse testet, die eine Liste von Objekt enthält. HierWie richte ich eine private Variable in einem Komponententest ein

ist, was ich habe

public class A 
{ 
    List<B> _list; 

    public A() 
    { 
     _list = new List<B>(); 
    } 
    public void AddNewB(DateTime time) 
    { 
     _list.Add(new B(time)); 
    } 
    public List<B> GetAllBs() 
    { 
     return _list; 
    } 
} 

Ich möchte einen Test haben, die beweisen, dass ein neues B Hinzufügen nicht meine Liste nicht löschen. Da die Liste jedoch privat ist, kann ich keine vorhandene Liste erstellen, ohne den Code durchzugehen, den ich testen möchte. Da Klasse A dafür verantwortlich ist, alle neuen Bs zu erstellen und sie zu ihrer Liste hinzuzufügen, und dass alle neuen A's eine leere Liste von Bs haben sollten, fühlt sich das Hinzufügen eines Parameters im Konstruktor seltsam an.

Edit: Ich reparierte GetAllBs, da es ein Copy-Paste-Fehler von AddNewBs war.

+3

Denken Sie daran, dass das Gerät Sie testen die Klasse ist, nicht das Verfahren. Solange sich die öffentliche Schnittstelle der Klasse selbst verhält, sollte es Ihnen egal sein, was sie intern tut. Soweit es Ihre Tests betrifft, existiert '_list' möglicherweise nicht einmal. –

+0

Sie möchten diese http://stackoverflow.com/a/1093481/2096538 lesen. Sie sollten sich nicht um die interne Implementierung der Klasse kümmern, Sie sollten prüfen, ob der extern sichtbare Effekt Ihren Erwartungen entspricht, andernfalls sind Ihre Tests an die interne Implementierung der Klasse gebunden. –

+0

Ich fühlte mich komisch, die Methode zu nennen, die ich testen wollte, um meinen Test einzurichten. –

Antwort

4

Zunächst einmal wird diese Methode nicht kompilieren:

public void GetAllBs(DateTime time) 
{ 
    return _list; 
} 

Es hat Rückgabetyp void (gibt nichts), aber sie zurückkehren List<B>. Außerdem benötigen Sie keinen Parameter, um das Ergebnis zurückzugeben. Ändern Sie ihn auf:

public List<B> GetAllBs() 

Über Test: Sie einfach Ihre Liste testen. Ihre Testverfahren wird wie folgt sein:

[TestMethod] 
public void Test() 
{ 
    A a = new A(); 
    a.AddNewB(DateTime.Now);  
    a.AddNewB(DateTime.Now); 

    Assert.AreEqual(2, a.GetAllBs().Count); 
} 

Sie Objekt der Klasse erstellen sollten A und rufen AddNewB() ein Element hinzuzufügen. Um sicher zu sein, dass die Liste nach dem Hinzufügen eines neuen Elements nicht gelöscht wird, sollten Sie eine weitere hinzufügen und Count der Elemente in der Liste überprüfen. Um dies zu tun, sollten Sie GetAllBs() anrufen - es wird eine Liste zurückgeben - und erhalten Count. Die Count sollte 2 entsprechen.

Wenn Sie sichergehen möchten, dass die Methode getestet wird, können Sie ein Tool verwenden, das Codeabdeckung anzeigt (DotCover, OpenCover).

+0

GetAllBs war ein Copy-Paste-Fehler von AddNewB. –

1

Sie können auch Unit-Test-Tools verwenden, die Ihnen die falschen privaten Felder erlauben, zum Beispiel verwende ich Typemock, die diese Funktion haben. so können Sie eine lokale Liste im Test erstellen und auf den privaten Bereich, um Ihre Methode zu testen injizieren:

[TestMethod] 
public void TestMethod1() 
{ 
    List<B> fakeList = new List<B> { new B(DateTime.Now), new B(new DateTime(1956, 01, 21)) }; 
    var classA = Isolate.Fake.Instance<A>(Members.CallOriginal,ConstructorWillBe.Ignored); 

    var fakePrivate = Isolate.NonPublic.InstanceField(classA, "_list"); 
    fakePrivate.Value = fakeList; 

    classA.AddNewB(DateTime.MaxValue); 

    var res = classA.GetAllBs(); 

    Assert.AreEqual(3, res.Count); 
} 
Verwandte Themen