0

私は単体テストに手を出し始め、私のプレゼンター メソッドの 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 の値がこのメソッドに渡され、使用されることはありません。

これが間違っていることはわかっていますが、これをどのように達成する必要がありますか? 各テスト データ シナリオを設定する個別のモック データ アクセス クラスを作成する必要がありますか?

4

1 に答える 1