1

以下のコードはコンストラクターのないインスタンスクラスに存在します。どこから単体テストを書き始めるのかわかりません。

たとえば、価格は「2/9」なので、secondPartは9です。また、_randomはRandomクラスのオブジェクトです。

    public string RefreshPrice(string price, out bool isUpOrDown, out bool isChanged)
    {
        if (string.IsNullOrEmpty(price))
        {
            isUpOrDown = false;
            isChanged = false;
            return price;
        }

        int secondPart;
        string[] priceParts = price.Split('/');
        int newPrice = 0;
        if(int.TryParse(priceParts[1], out secondPart))
        {
            newPrice = secondPart >= 2 ? _random.Next(2, 20) : 2;
        }

        isUpOrDown = (newPrice > secondPart);
        isChanged = (newPrice != secondPart);

        secondPart = newPrice;
        return string.Format("{0}/{1}", priceParts[0], secondPart);
    }
4

1 に答える 1

2

コンストラクターのないインスタンスクラス

したがって、このクラスにはデフォルトのctorがあります。

Legacy legacyUnderTest = new Legacy();

がデフォルトのコンストラクターで設定されていない場合_randomは、_randomを設定するヘルパーメソッドgetLegacyUnderTestを作成する必要があります。これは、本番環境での設定方法か、PrivateObjectを使用したテスト中にプライベートにアクセスするためのこのスタックオーバーフローの回答を参照してください。

private Legacy getLegacyUnderTest()
{
    Legacy result = new Legacy();
    //set _random however it is set in production for the general need of your test
    return result;
}

彼らはそうなのでout、あなたはテストのためのあなたのアレンジステップの一部としてあなたの旗を宣言する必要があるでしょうbool、そしてあなたは行ってもいいです:

[TestMethod]
public void RefreshPrice_EmptyPriceIsNotUpDownIsNotChange_ReturnsInitalPrice()
{
    //Arrange
    Legacy legacyUnderTest = new this.getLegacyUnderTest();
    bool isUpDown = false;
    bool isChange = false;
    string initialPrice = string.Empty;

    //Act
    string result = legacyUnderTest.RefreshPrice(initalPrice, isUpDown, isChange);

    //Assert
    Debug.IsEqual(initalPrice, result);
}

これで(VSを前に付けずにスニペットを作成することで必然的に発生した問題を修正した後)、の値を変更するだけでisUpDown、テストする必要のあるすべての可能性をカバーできますisChangeinitialPrice

これは、初期価格のさまざまな形式(有効、null、空、および無効の形式)と、これらのフラグのさまざまなtrue/falseの組み合わせを組み合わせたものである必要があります。

于 2012-10-13T17:59:16.227 に答える