这是一个非常基本的问题,但我仍然找不到合适的答案。在我的测试中,有可能有空值,因此最后阶段(Act)开始看起来有点奇怪(它不再仅仅是行为)。我的意思是:
Assert.IsNotNull(variable);
var newVariable = variable.Property;
Assert.IsNotNull(newVariable);
var finalVariable = newVariable.AnotherProperty;
Assert.AreEqual(3, finalVariable.Count);
现在它们显然是相关的,我必须确保这些值不是null,而且在一次测试中有三个断言,并且act部分开始看起来不正确。
那么这种情况下的一般解决方案是什么?有没有比3个测试更聪明的东西,每个断言一个,并在最后2个断言之前检查为空?
答案 0 :(得分:1)
基本上有两种方法可以解决您的问题:
选择哪个选项很大程度上取决于测试中的代码。如果先决条件在其他测试中重复,则它提示单独的测试方法。如果前提条件在生产代码中有反映,那么它再次提示单独的测试方法。
另一方面,如果它只是为了增强你的信心而做的事情,也许单独的测试太多了(但正如其他答案所述,这可能表明你不在完全控制你的测试或你一次测试太多东西。
答案 1 :(得分:0)
我认为您应该将此测试分成三个测试,并根据发生的情况对其进行命名。即使您在这些测试中的行为相同,您也可以通过检查方法的返回值来测试不同的方案,这是非常明智的。
答案 2 :(得分:0)
Nulls是皇室的痛苦。问题是,它们能合法存在吗?
让我们将讨论与代码和测试分开。
如果null不存在,那么代码本身而不是测试应该检查并验证它们不是null。出于这个原因,我的代码的每个方法都是使用一个检查参数的片段构建的:
public VideoPosition(FrameRate theFrameRate, TimeSpan theAirTime)
{
Logger.LogMethod("theVideoMovie", theFrameRate, "theAirTime", theAirTime);
try
{
#region VerifyInputs
Validator.Verify(theFrameRate);
Validator.Verify(theAirTime);
Validator.VerifyTrue(theAirTime.Ticks >= 0, "theAirTime.Ticks >= 0");
如果null在代码中是合法的,但是您正在测试返回值不应为null的场景,那么您当然必须在测试代码中验证这一点。
答案 3 :(得分:0)
在单元测试中,您应该能够控制所测试类的每个输入。这意味着您可以控制变量是否具有值。
所以你会有一个单元测试强制你的变量为null,然后断言。
然后你将进行另一个测试,你可以确定你的变量有一个值,你甚至需要其他的断言。
我前段时间写了一篇博客。也许它可以提供帮助:Unit Testing, hell or heaven?