私は単体テストに手を出し始め、私のプレゼンター メソッドの 1 つをテストするいくつかのテストを作成しました。このテストには、私のデータ アクセス クラスのモックと、特に 1 つのメソッドが必要です。これは、私のデータ アクセス クラスの元のメソッドです。
public IEnumerable<IArea> GetAreaList()
{
ConnectToTFSProject();
XmlNode areaNode = GetAreaNode();
List<IArea> areaList = new List<IArea>();
foreach (XmlNode node in areaNode.FirstChild.ChildNodes)
{
IArea area = new Area() { AreaName = node.Attributes["Name"].Value };
areaList.Add(area);
}
areaList.Sort();
return areaList;
}
次のようなさまざまなシナリオでプレゼンター メソッドをテストしたいと思います。
- エリアの通常のリスト
- 領域の空のリスト
- 重複のある領域のリスト
- 空の文字列領域を 1 つ含むリストまたは領域
私が最初に考えたのは、これらのシナリオごとに個別のモック データ アクセス クラスを作成することでした。これは少し面倒だと思ったので、メソッドを少し変更して、現在のテストに固有のデータを含むさまざまな xml ファイルを読み取れるようにしました。私のモックメソッドの外観は次のとおりです。
public IEnumerable<IArea> GetAreaList(string dataSource)
{
List<IArea> areaList = new List<IArea>();
XmlTextReader areaReader = new XmlTextReader(dataSource);
while (areaReader.Read())
{
if (areaReader.NodeType == XmlNodeType.Text)
areaList.Add(new Area() { AreaName = areaReader.Value });
}
return areaList;
}
このモック メソッドは、次のように PresenterTest クラスから呼び出されます。
[TestMethod]
public void PopulateAreaComboBox_WithValidAreaList()
{
//Act
_presenter.PopulateAreaComboBox(mockFolderPath + "MockAreaList.xml");
//Assert
Assert.AreEqual(3, _view.AreaListLoaded.Count);
}
[TestMethod]
public void PopulateAreaComboBox_WithEmptyAreaList()
{
//Act
_presenter.PopulateAreaComboBox(mockFolderPath + "MockEmptyAreaList.xml");
//Assert
Assert.AreEqual(0, _view.AreaListLoaded.Count);
}
さて、ここでの問題は、元のメソッドの署名を変更する必要があることです (dataSource パラメーターへの参照を追加することにより)。
public IEnumerable<IArea> GetAreaList(string dataSource)
このパラメーターは単体テストにのみ必要なため、実際のプレゼンター クラスから null の値がこのメソッドに渡され、使用されることはありません。
これが間違っていることはわかっていますが、これをどのように達成する必要がありますか? 各テスト データ シナリオを設定する個別のモック データ アクセス クラスを作成する必要がありますか?