1

探しているデザイン/パターンです。

私は既存の列挙型を理論として使用する予定のnunitテストを持っています。既存の列挙型には、ほぼ 30 のメンバーがあります。

次のように言います。

enum ABigEnum
{
    A,
    B,
    C,
    D
}


[Theory]
public void Test(ABigEnum enumValue)
{
//generate someValue based upon enumValue    
Assert.That(someValue, Is.True, "an amazing assertion message");
}

ただし、テストでは、False の場合は enum の値 D を、True の場合はその他すべての値をアサートする必要があります。if-else 条件を使用せずにそれを行うことはできますか (神聖な教義として、テストでは条件を避けます)? それとも、あなたたちが従う興味深いパターンはありますか?

4

3 に答える 3

2

このようなテストを作成するときは、NUnit が提供するTestCaseSource属性を使用するのが好きです。これらのテストはデータ ドリブン テストと呼ばれていると思います。

テストの私のバージョンは次のようになります。

public class TestClass
{
    public enum ABigEnum
    {
        A,
        B,
        C,
        D
    }

    public IEnumerable TestValues
    {
        get
        {
            yield return new TestCaseData(ABigEnum.A, false).SetName("Assert A");
            yield return new TestCaseData(ABigEnum.B, false).SetName("Assert B");
            yield return new TestCaseData(ABigEnum.C, false).SetName("Assert C");
            yield return new TestCaseData(ABigEnum.D, true).SetName("Assert D");
        }
    }

    [Theory]
    [TestCaseSource(typeof(TestClass), "TestValues")]
    public void Test(ABigEnum enumValue, bool assertValue)
    {
        //generate someValue based upon enumValue    
        Assert.That(enumValue, Is.EqualTo(assertValue), "an amazing assertion message");
    }

}

編集 1

Datapoint実際には、属性を で使用できますTheory。このようなもの:

    public enum ABigEnum
    {
        A,
        B,
        C,
        D
    }

    [Datapoint]
    public Tuple<ABigEnum, bool>[] TestValues = new[]
                       {
                           new Tuple<ABigEnum, bool>(ABigEnum.A, false), new Tuple<ABigEnum, bool>(ABigEnum.B, false),
                           new Tuple<ABigEnum, bool>(ABigEnum.C, false), new Tuple<ABigEnum, bool>(ABigEnum.D, true)
                       };

    [Theory]
    public void Test(Tuple<ABigEnum,bool> data)
    {
        //generate someValue based upon enumValue    
        Assert.That(data.Item1, Is.EqualTo(data.Item2), "an amazing assertion message");
    }
于 2013-08-08T09:16:20.077 に答える
1

これで要件を達成できるはずです:

enum ABigEnum
{
    A,
    B,
    C,
    D
}

[Theory]
public void Test(ABigEnum enumValue)
{
    bool someValue = enumValue != ABigEnum.D;
    Assert.That(someValue, Is.True, "an amazing assertion message");
}

これによりfalse、渡すときDtrue他のすべての値が得られます。

このロジックはシステムによって「認識」できるものではないため、if / else または switch であるかどうかを判断する必要があります。

ただし、この「テスト」は、純粋なテストというよりも方法のように見えます。強調表示すると、テストに多くのロジックが必要ないため、テストして達成しようとしていることを再考する必要がある場合があります。 .

于 2013-08-08T09:06:40.417 に答える