6

我正在使用 NUnit 2.5.3 TestCaseSource 属性并创建一个工厂来生成我的测试。像这样的东西:

[Test, TestCaseSource(typeof(TestCaseFactories), "VariableString")]
public void Does_Pass_Standard_Description_Tests(string text)
{
    Item obj = new Item();
    obj.Description = text;
}

我的来源是这样的:

public static IEnumerable<TestCaseData> VariableString
{
    get
    {
        yield return new TestCaseData(string.Empty).Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Empty_Text");
        yield return new TestCaseData(null).Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Null_Text");
        yield return new TestCaseData("  ").Throws(typeof(PreconditionException))
            .SetName("Does_Reject_Whitespace_Text");
    }
}

我需要做的是向变量字符串添加最大长度检查,但是这个最大长度是在被测类的合同中定义的。在我们的例子中,它是一个简单的公共结构:

   public struct ItemLengths
    {
        public const int Description = 255;
    }

我找不到任何将值传递给测试用例生成器的方法。我已经尝试过静态共享值,但这些没有被拾取。我不想将东西保存到文件中,因为每次代码更改时我都需要重新生成这个文件。

我想将以下行添加到我的测试用例中:

yield return new TestCaseData(new string('A', MAX_LENGTH_HERE + 1))
    .Throws(typeof(PreconditionException));

概念上相当简单的东西,但我发现不可能做的事情。有什么建议么?

4

2 回答 2

2

将测试的参数更改为类而不是字符串。像这样:

公共类 StringTest { 公共字符串 testString; 公共 int 最大长度;}

然后构造这个类作为参数传递给 TestCaseData 构造函数。这样你就可以传递字符串和你喜欢的任何其他参数。

另一种选择是让测试有 2 个字符串和 int 参数。

然后是 TestCaseData("mystring", 255)。您是否意识到他们可以有多个参数?

韦恩

于 2010-10-30T03:58:42.940 回答
1

我遇到了与您类似的问题,最终编写了一个小的 NUnit 插件和一个扩展 NUnit TestCaseSourceAttribute 的自定义属性。在我的特殊情况下,我对将参数传递给工厂方法不感兴趣,但您可以轻松地使用相同的技术来实现您想要的。

这并不难,只需要我写三个小班之类的东西。你可以阅读更多关于我的解决方案的信息:blackbox testing with nunit using a custom testcasesource

PS。为了使用这种技术,你必须使用 NUnit 2.5(至少)祝你好运。

于 2011-12-12T10:51:02.200 回答