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");
}

但是,测试应该断言,枚举中的值 D 为 False,所有其他值为 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 回答
0

好的,我找到了这种编写测试的方法。如果有人发布更好的方法,应接受它。否则,这是答案。

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

IsD(ABigEnum enumValue)
{
    return (enumValue==ABigEnum.D)
}

可能不是最理想的解决方案,并且确实在外部引入了测试的条件代码路径。

于 2013-08-08T10:56:13.750 回答