这是我正在寻找的设计/模式。
我有一个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条件(作为一个神圣的学说,我在测试中避免条件)吗? 或者你们有没有任何有趣的模式?
答案 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)
}
可能不是最理想的解决方案,并且在外部引入了测试的条件代码路径。