gpt4 book ai didi

string - 我应该如何测试方法中的 null 和/或空字符串参数?

转载 作者:行者123 更新时间:2023-11-28 19:43:53 25 4
gpt4 key购买 nike

通常类的方法带有必须再次验证为 null 或空的字符串参数,例如这个例子:

public class MyClass {

public void MyMethod(string param){

if(string.IsNullOrEmpty(param)){
throw new ArgumentNullException(...);
}
//...
}
}

很明显,对于两个(无效)值,该方法的行为是相同的。这是一种很常见的情况,而且在测试这些方法时,我总是很疑惑如何去做。我总是为这些情况创建两个单独的测试:

[TestClass]
public class Tests {

[TestMethod]
public void MyMethod_should_fail_if_param_is_null(){
//...
myclass.MyMethod(null);
//...
}

[TestMethod]
public void MyMethod_should_fail_if_param_is_empty(){
//...
myclass.MyMethod("");
//...
}

但我看到太多冗余。这些测试完全相同,唯一的区别是传递给方法的参数。这让我非常困扰,因为我必须为每个字符串参数创建两个测试。具有 3 个参数的方法将有 6 个测试仅用于测试参数。

我认为这是测试这些参数的正确方法,但如果我知道 99% 的字符串参数将以相同的方式进行验证,那么只测试它们是否为 null(或空)并假设其他情况下的行为是否相同?

我想知道您对此有何看法。我知道我要问的更多是技术意见而不是技术问题,但我认为测试社区可能对这种情况有一些有趣的说法。

谢谢!

最佳答案

我个人考虑对所有参数使用单一测试。这不遵循单元测试的正常教条,但它增加了测试的可读性(通过最大限度地减少专门用于相当重复的案例的测试代码的数量)并且没有太多缺点。是的,如果测试失败,您不知道在第一个失败的检查之后的所有检查是否也会失败 - 但这在实践中真的是一个问题吗?

重要的一点是确保您有测试案例的捷径。例如,您可以这样写(如果您的单元测试框架还没有):

public static void ExpectException<T>(Action action) where T : Exception
{
try
{
action();
Assert.Fail("Expected exception " + typeof(T).Name);
}
catch (T exception)
{
// Expected
}
}

然后你可以这样写:

[Test]
public void MyMethodFailsWithInvalidArguments()
{
ExpectException<ArgumentNullException>(() => myClass.MyMethod(null));
ExpectException<ArgumentException>(() => myClass.MyMethod(""));
}

比使用单独的 try/catch block ,甚至使用 ExpectedException 属性和多个测试要简洁得多。

对于还想验证在每种情况下都没有触及模拟对象(以检查是否避免了副作用)的情况,您可能需要重载,或者可能需要为常见异常(如 ArgumentNullException)进行重载>.

对于单参数方法,您甚至可以编写一个方法来准确封装您需要的内容:

public void ExpectExceptionForNullAndEmptyStrings(Action<string> action)
{
ExpectException<ArgumentNullException>(() => action(null));
ExpectException<ArgumentException>(() => action(""));
}

然后调用它:

[Test]
public void MyMethodFailsWithInvalidArguments()
{
// This *might* work without the
ExpectExceptionForNullAndEmptyStrings(myClass.MyMethod);
}

...也许还有一个用于具有单个参数但非 void 返回类型的方法。

虽然这可能有点远:)

关于string - 我应该如何测试方法中的 null 和/或空字符串参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/930594/

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