0

メソッドが基本クラスのリストにオブジェクトを追加するかどうかをテストしたいと思います。

私の問題は、リストが保護されているため、テストの配置に入力できないことです。したがって、リストは空で、メソッドは特定のインデックスにオブジェクトを追加できません。

スタブ リストを作成し、公開せずに実際の基底クラス リストの代わりに使用するにはどうすればよいですか?

NUnit と Moq を使用しています。

私の問題を模倣するためのコードを次に示します。

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.
}
4

1 に答える 1

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アクセサーを追加しました。

于 2015-05-19T21:08:44.657 に答える