我可以在单元测试中这样做吗?

时间:2009-06-28 07:12:16

标签: .net unit-testing

我不确定我应该在这做什么。我应该硬编码所有值还是应该在CONST变量中使用它们。我看到的所有内容似乎都难以编码,所以我不确定。

就像我现在正在做的那样。

在我的控制器中说我有一个验证测试,以检查用户是否尝试提交带有空白字段的表单。

现在我要if语句检查blank或null变量。如果发生这种情况,那么我会将错误添加到ModelState,并显示我写的错误消息。

所以在我的单元测试中,我想确保如果提交了一个空白表单变量,它会被捕获。

现在在我的单元测试中,我刚刚制作了一个CONST变量并复制并粘贴了验证消息。

所以在我的断言中,我比较了实际消息与我的CONST Varrible中存储的消息的比较。我这样做是通过调用Model状态并将字段调用到我希望错误的位置。

喜欢:

result.ViewData.ModelState [ “用户名”]错误[0];

因此,如果消息存在,那么它必须进入我的代码,否则它将不存在。

所以我想到也许我应该创建一个静态的新类并保存所有这些CONST变量。

这样,控制器视图和单元测试都可以使用它们。这样,如果我要更改错误消息,那么我只需要将其更改为一个地方。由于我没有测试错误消息是什么,我正在测试它是否已设置。

同样的事情对于例外我说有一些自定义消息,但我没有测试消息是否正确,如果预测被捕获则更多。

我测试它的方式是查看消息是否是我期望的消息,因为如果它不是消息或者消息不存在则会出现问题。

我是单元测试的新手,所以我想确保我要做的事情不会导致我的单元测试失败。

对我来说这很有道理,但我认为最好先检查一下。

由于

2 个答案:

答案 0 :(得分:1)

“我应该硬编码所有值还是应该在CONST变量中使用它们。”

我不确定你的意思。在单元测试类中包含const变量是很好的。 E.g:

class FooTest
{
    private static readonly string FOO_MESSAGE = "BAR"; 

    public static const string BAZ_MESSAGE = "BOO";

...

    Assert.AreEqual(FOO_MESSAGE, e.ToString());
}

“所以我想到我可能会创建一个静态的新类并保存所有这些CONST变量。

这样,控制器视图和单元测试都可以使用它们。这样,如果我需要更改错误消息,那么我只需要将其更改为一个位置。“

这似乎不对。控制器用于输出错误的机制是私有的。这不应该不必要地暴露在单元测试中。通过这样做,你显然更有可能错误将被捕获。控制器和测试将“同意”,因为他们使用相同的半公共机制。

“由于我没有测试错误信息是什么,我正在测试它是否已设置。”

如果您真的没有测试消息,为什么测试甚至不知道呢?

答案 1 :(得分:1)

以对后续更改强大的方式编写每个测试非常重要。您经常需要在以后更改部分应用程序,并且每次执行此操作时,都有可能会破坏您的一项或多项测试。

如果您的测试对变化很有效,那么失败的测试将真正表明存在回归错误。

但是,如果您的测试是所谓的Overspecified Tests,那么您在代码库中进行的每一个小改动都可能导致测试失败 - 不是因为存在回归错误,而是因为测试太脆弱了。当发生这种情况时,你会对测试失去信心;测试维护需要花费大量时间,最终你最终会放弃测试套件。

当我读到你的问题时,你已经开始看到这种反模式的轮廓。我认为这就是为什么你不测试返回的特定文本,而只是测试它们是否被设置。我认为这是正确的 - 我很少测试特定字符串,而是测试字符串是否完全。这使得测试更加稳健,您可以避免使用Overspecified Test反模式。

在许多情况下,不是在两个字符串上执行Assert.AreEqual,而是使用Assert.IsNotNull,或者Assert.IsFalse(string.IsNullOrEmpty(result))(您的平台似乎是.NET)。

通常,基于派生值的断言对于更改非常可靠,因此您可能需要查看以下博客文章:

如果你觉得特别喜欢冒险,我只能建议你阅读xUnit Test Patterns,我提到的许多模式和反模式都来自这里。 The Art of Unit Testing也很好......