6

これら 3 つのテストは、異なる静的関数を使用して StartInfo インスタンスを作成する点を除いて、同じです。私はこのパターンをテストコード全体で使用しています。[TestCase] を使用するか、ボイラープレート コードを削減するその他の方法でこれを単純化できるようにしたいと考えています。私の知る限りでは、デリゲートを [TestCase] 引数として使用することは許可されていません。ここにいる人々が、以下のコードをより簡潔にする方法について創造的なアイデアを持っていることを願っています。

    [Test]
    public void ResponseHeadersWorkinPlatform1()
    {
        DoResponseHeadersWorkTest(Platform1StartInfo.CreateOneRunning);
    }
    [Test]
    public void ResponseHeadersWorkinPlatform2()
    {
        DoResponseHeadersWorkTest(Platform2StartInfo.CreateOneRunning);
    }
    [Test]
    public void ResponseHeadersWorkinPlatform3()
    {
        DoResponseHeadersWorkTest(Platform3StartInfo.CreateOneRunning);
    }

    void DoResponseHeadersWorkTest(Func<ScriptResource,StartInfo> startInfoCreator)
    {
        ScriptResource sr = ScriptResource.Default;
        var process = startInfoCreator(sr).Start();
        //assert some things here
    }
4

2 に答える 2

8

まず、原作は悪くないと思います。アサーションがテスト ケースごとに異なる場合にのみ、面倒です。

とにかく、テスト ケースを使用できますが、より複雑な型を使用するため、標準の [TestCase] 属性を介して実行することはできません。代わりに、public IEnumerable<> をデータ プロバイダーとして使用し、テスト メソッドに[TestCaseSource]属性のタグを付ける必要があります。

次のようなものを試してください:

    public IEnumerable<Func<ScriptResource, StartInfo>> TestCases
    {
        get
        {
            yield return Platform1StartInfo.CreateOneRunning;
            yield return Platform2StartInfo.CreateOneRunning;
            yield return Platform3StartInfo.CreateOneRunning;
        }
    }

    [TestCaseSource("TestCases")]
    public void MyDataDrivenTest(Func<ScriptResource, StartInfo> startInfoCreator)
    {
        ScriptResource sr = ScriptResource.Default;
        var process = startInfoCreator(sr);

        // do asserts
    }
}

これは、パラメーターを含む TestCaseData インスタンスを生成する標準パターンのより簡潔なバージョンです。TestCaseData のインスタンスを生成すると、各テストにさらに情報と動作 (予想される例外、説明など) を追加できますが、少し冗長になります。

私がこれを本当に気に入っている理由の 1 つは、'act' 用に 1 つのメソッドを作成し、'assert' 用に 1 つのメソッドを作成し、それらを個別に組み合わせて使用​​できることです。たとえば、私の友人は昨日、2 つのアクションを使用して何かを行っていました (「メソッド Blah が呼び出されると、ViewModel のこのメソッドがトリガーされる必要があります」)。非常に簡潔で効果的です!

于 2010-05-06T22:00:50.560 に答える
0

よさそうです。おそらく工場を追加しようとしていますか?または、これらのメソッドを (テスト セットアップで) アクション リストに追加し、最初のアクション デリゲート、2 番目のアクション デリゲート、3 番目のアクション デリゲートを呼び出すことができます。

于 2010-05-06T22:00:01.810 に答える