2009-06-28 99 views
1

我不知道我应该在这里做什么。我应该硬编码所有的值还是应该让它们处于CONST变量中。我看到的所有东西似乎都难以编码,所以我不确定。我可以在单元测试中做到这一点吗?

这就是我现在正在做的事情。

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

现在我会有一个if语句检查空白或空变量。如果发生这种情况,我会将错误添加到ModelState中,并附带一条我写的错误消息。

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

现在在我的单元测试我只是做了一个const varible和复制和粘贴的。

所以我断言我比较有什么实际信息与存储在我的CONST Varrible消息的确认消息。我通过调用模型状态来完成此操作,并将该字段调用到我期望出现错误的地方。 。

喜欢:

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

所以如果消息在那里,那么它一定已经进入我的代码,否则它不会存在。

所以它发生在我身上,也许我应该创建一个新的类,它将是静态的并保存所有这些CONST变量。

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

同样的事情说异常我有一些自定义消息,但我不测试,如果消息是正确的,更多如果预期被抓住。

虽然我测试它的方式是看看消息是否是我期望的消息,因为如果它不是消息或消息不存在,那么出现了问题。

我是新来的单元测试,所以我想确保我要做的事情不会如何搞砸我的单元测试。

对我来说这是有道理的,但我认为更好的检查首先。

感谢

回答

1

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

如果您的测试可以更改,那么失败的测试将真正指示回归错误。然而,如果你的测试是所谓的超规范化测试,那么你在代码库中所做的每一点小改动都可能导致测试失败 - 这不是因为存在回归错误,而是因为测试过于脆弱。发生这种情况时,你对测试失去信心;测试维护需要很长时间,最终你最终会放弃测试套件。

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

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

在一般情况下,断言是非常强大的改​​变,所以你可能想看看下面的博客文章:

如果你感觉特别冒险,我只能推荐你读xUnit Test Patterns,从我提到的许多模式和反模式的起源开始。 The Art of Unit Testing也不错...

1

“我应该硬编码中的所有值或者我应该让他们在一个const变量。”

我不确定你的意思。在单元测试类中使用const变量是很好的。例如: -

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

public static const string BAZ_MESSAGE = "BOO"; 

... 

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

“所以我想到也许我应该做一个新的类,它是静态的,容纳所有这些常量代替。

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

这似乎是错误的。控制器用于输出错误的机制是私有的,不应该不必要地暴露给单元测试,通过这样做,显然会使错误更容易被忽略,控制器和测试将会“同意”,因为它们使用相同的半公开机制。

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

如果你真的没有测试这条信息,为什么测试应该知道呢?

+0

这就是我的意思是关于CONST变量: http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx 其次像我说我是单元测试新手,还有一些是我写的第一个测试。 所以我不知道如何测试,否则。我不确定如何判断这种情况是否以其他方式得到满足,因为这就是所有情况。 所以不知道我会如何测试说没有检查消息我的验证错误我不知道我可以测试的错误消息的其他属性。 – chobo2 2009-06-28 07:33:24

+0

如果你只关心是否存在错误,那么在抛出错误时设置一个变量并使用它。如果你说了你正在使用的单元测试框架,并发布了一些代码,这将会有所帮助。 – 2009-06-28 08:05:58

相关问题