NUnit理论有例外

时间:2013-08-08 08:59:57

标签: c# unit-testing testing nunit theory

这是我正在寻找的设计/模式。

我有一个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条件(作为一个神圣的学说,我在测试中避免条件)吗? 或者你们有没有任何有趣的模式?

3 个答案:

答案 0 :(得分: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");
}

在为{1}}和false传递所有其他值时,这将为您D

因为这个逻辑不是系统可以“知道”的东西,所以你必须做出某种决定,无论是if / else还是switch。

然而,这个“测试”看起来更像是一种方法,而不是纯粹的测试,你可能想重新思考一下你正在测试和试图实现什么,因为当你强调你不要在测试中真的需要很多逻辑。

答案 1 :(得分:1)

我喜欢在编写此类测试时使用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");
    }

答案 2 :(得分: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)
}

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