NUnit:在断言中使用对象之前,我是否应该检查对象是否为空?
NUnit: Should I check that objects are not null before using them in asserts?
我正在编写一个测试,调用一个可能 return 为空的方法。在此特定测试中,returned 对象必须 not 为 null,并且其上的某些 属性 必须匹配特定值。示例:
var obj = thing.GetObject();
Assert.That(obj, Is.Not.Null);
Assert.That(obj.Name, Is.EqualTo("Name"));
这是我在 C++ 中的习惯,在 C++ 中,您通常会在使用指针之前进行断言,因为访问 null 会导致单元测试崩溃(并且您希望避免这样做)。然而,在 C# 中,访问 null 对象是一个正常的异常。做我上面所做的事情是一个好习惯,还是继续访问对象并在对象为 null 时依赖异常使测试用例失败?如:
var obj = thing.GetObject();
Assert.That(obj.Name, Is.EqualTo("Name")); // Throws if `obj` is null
我在这件事上没有权威,但我认为如果您断言它不是 null 而不是让它抛出异常,您会得到更有意义和一致的测试结果消息。我在自己的单元测试中这样做,这是值得的。
NullReferenceException
表示您错过了某些内容。在测试 属性 之前断言结果不为 null 是 not 缺少那个东西。
恐怕要看情况了。
在您给出的示例中,没有初始设置,但您声明调用的方法有时可能 return 为空。如果没有该设置,您将无法测试 null 或非 null,因为(如前所述)两者皆有可能。这样的测试没有用。
OTOH 在实际测试中,您将完成设置并且实际上应该知道 您期望的结果。既然如此,就照你做的那样测试一下吧。
您还应该在对象设置为 return null 的情况下进行测试,并针对该情况进行测试。
我正在编写一个测试,调用一个可能 return 为空的方法。在此特定测试中,returned 对象必须 not 为 null,并且其上的某些 属性 必须匹配特定值。示例:
var obj = thing.GetObject();
Assert.That(obj, Is.Not.Null);
Assert.That(obj.Name, Is.EqualTo("Name"));
这是我在 C++ 中的习惯,在 C++ 中,您通常会在使用指针之前进行断言,因为访问 null 会导致单元测试崩溃(并且您希望避免这样做)。然而,在 C# 中,访问 null 对象是一个正常的异常。做我上面所做的事情是一个好习惯,还是继续访问对象并在对象为 null 时依赖异常使测试用例失败?如:
var obj = thing.GetObject();
Assert.That(obj.Name, Is.EqualTo("Name")); // Throws if `obj` is null
我在这件事上没有权威,但我认为如果您断言它不是 null 而不是让它抛出异常,您会得到更有意义和一致的测试结果消息。我在自己的单元测试中这样做,这是值得的。
NullReferenceException
表示您错过了某些内容。在测试 属性 之前断言结果不为 null 是 not 缺少那个东西。
恐怕要看情况了。
在您给出的示例中,没有初始设置,但您声明调用的方法有时可能 return 为空。如果没有该设置,您将无法测试 null 或非 null,因为(如前所述)两者皆有可能。这样的测试没有用。
OTOH 在实际测试中,您将完成设置并且实际上应该知道 您期望的结果。既然如此,就照你做的那样测试一下吧。
您还应该在对象设置为 return null 的情况下进行测试,并针对该情况进行测试。