gpt4 book ai didi

c# - 负面测试 - 我应该期待确切的异常(exception)吗?

转载 作者:行者123 更新时间:2023-11-30 22:14:35 27 4
gpt4 key购买 nike

考虑以下方法

public void Foo(string str)
{
if (str == null)
throw new ArgumentNullException("str");

if (str.Length != 5)
throw new MyException();
}

假设我想像这样为它写一个负面测试:

public void TestFoo()
{
try
{
Foo(null); //this could be an remote call (e.g. WCF)
Assert.Fail("Expected ArgumentNullException");
}
catch (ArgumentNullException) {} //should this be "Exception" instead?

try
{
Foo("four"); //this could be an remote call (e.g. WCF)
Assert.Fail("Expected MyException");
}
catch (MyException) {} //should this be "Exception" instead?
}

在我看来,如上捕获特定异常是一个实现细节,这可能会使测试变得脆弱并且与实现(而不是接口(interface))过于耦合。显然 MyException 有一天可能会改变,但即使是 ArgumentNullException 也可能被包裹在其他异常中(例如通过 future 的 WCF 行为)。通常,测试知道“四个” 应该失败,而这就是它所关心的 - 失败。

异常(exception)情况(没有双关语意)可能是异常被翻译成传递给用户的东西,例如用户友好的消息(例如 UserNameTakenException 被映射用户名已被占用,请尝试不同的用户名)。在这种情况下,您需要确保传达正确的错误。即便如此,它还是有点问题,因为这意味着每个可能的用户错误都会出现不同类型的异常,但这可能还不算太糟糕(通常不会有很多这样的错误)。

我的思路有道理吗?我真的应该在不涉及面向用户的异常的测试用例中捕获通用 Exception 吗?

最佳答案

只需编写至少 4 个测试:

[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void TestFooForNull()
{
Foo(null);
}


[Test]
[ExpectedException(typeof(MyException))]
public void TestFooForInvalidSizeTooShort()
{
Foo("1234");
}


[Test]
[ExpectedException(typeof(MyException))]
public void TestFooForInvalidSizeTooLong()
{
Foo("123456");
}


[Test]
public void TestFoo()
{
Foo("12345");
}

编写单元测试时,最好针对每个测试处理一个特定案例。

关于c# - 负面测试 - 我应该期待确切的异常(exception)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com