2013-08-07 64 views
0

我想測試一個方法添加的目的是在基類的列表。存根保護列表中基類的單元測試

我的問題是,名單保護,我不能在我的測試安排填充它。因此該列表是空的,我的方法無法在特定索引處添加對象。

我如何做一個存根列表,並沒有使它公衆使用它,而不是真正的基類列表的?

我使用NUnit和起訂量。

Here's一些代碼來模仿我的問題:

public class Person 
{ 
    public string Name { get; set; } 
    readonly List<PhoneNumber> _numbers = new List<PhoneNumber>(); 

    public void AddNumber(PhoneNumber phoneNumber) 
    { 
     _numbers.Add(phoneNumber); 
    } 
} 

public class PhoneNumber 
{ 
    public int Number { get; set; } 
} 

public class BaseClass 
{ 
    protected List<Person> Persons = new List<Person>(); 
} 

public class DerivedClass : BaseClass 
{ 
    public void AddNumberToPersons(int index, PhoneNumber phoneNumber) 
    { 
     Persons[index].AddNumber(phoneNumber); // <-- Need to test if 
               // this gets called without errors 
    } 
} 

[Test] 
public void AddNumberToPersons_WhenAddingNumberToPersons_NumberGetsAddedToList() 
{ 
    // I think I need to use a stub list or else the list is empty 
    // and index is out of range. 

    // Assert that number is added to the list. 
} 
+1

它是真正重要的電話號碼是否被添加到人或不?這將如何影響你的課堂行爲?人受到保護,所以你真的不關心它的狀態。您應該關心會影響您班級用戶的變化 –

+0

嗯,您的權利,不是電話號碼是否被添加。 我需要測試的是當我打電話給AddNumberToPersons(int index,PhoneNumber phoneNumber)。 Persons [index] .AddNumber(phoneNumber);得到執行。 但我仍然需要一個存根列表來執行該行而不會引發異常嗎? –

+0

執行'AddNumber'方法會如何影響你的類的行爲?將電話號碼添加到其中一個人後,它的行爲會有所不同? –

回答

0

有一個在爲什麼你可能要考慮一下它是什麼,你想測試的評論一些很好的討論。也就是說,在某些情況下,您可能希望將您的類設置爲使用其基類進行測試。而不是在這種情況下使用Moq,我傾向於使用類的手滾測試版本。所以,在你的測試項目,如果你能創造的DerivedClass這樣的可測試版本:

public class TestableDerived : DerivedClass { 
    public TestableDerived(List<Person> people) { 
     this.Persons = people; 
    } 
    public List<Person> AccessablePersons { get { return this.Persons; } } 
} 

TestableDerived類訪問層級的protected成員,因此,您可以將測試安排部分中填充它。通常情況下,您可以驗證相應的Person的狀態已更新以添加該號碼。這可能會給你一個測試是這樣的:

var sut = new TestableDerived(new List<Person>(){new Person(), new Person()}); 

sut.AddNumberToPersons(1, new PhoneNumber { Number = 1234 }); 

Assert.AreEqual(1, sut.AccessablePersons[1].Numbers.Where(x=>x.Number == 1234).Count()); 

在你的具體的例子,這不會然而,由於你的Person類沒有辦法,一旦他們被添加到訪問PHONENUMBERS工作。有很多方法可以解決這個問題,但是這似乎並不是你問題的重點,所以我選擇相信這是你的示例代碼中的一個遺漏,並添加了一個Numbers訪問器。