【发布时间】:2011-03-23 05:30:52
【问题描述】:
任何代码都可能产生副作用。大多数时候,副作用可能是糟糕设计和/或需要重构的标志,但在单元测试时,我发现很难进行测试。考虑以下示例:
[Test]
public void TrimAll_Removes_All_Spaces()
{
// Arrange
var testSubject = "A string with lots of space";
var expectedResult = "Astringwithlotsofspace";
// Act
var result = testSubject.TrimAll();
// Assert
Assert.AreEqual(expectedResult, result);
}
测试以下扩展:
public static string TrimAll(this string str)
{
PokeAround();
return str.Replace(" ", "");
}
测试会通过,但没有防范副作用。调用PokeAround 的影响将完全被忽视。
鉴于您不知道 PokeAround 是什么 - 它可以是任何东西! - 你如何编写一个防止它的测试?有可能吗?
说明:
有几个关于 PokeAround 的 cmets 完全未知这是一个非常不可能的情况,因为我们在编写测试时有源代码。不过,我问这个问题的原因是想找到一种方法来防止稍后添加的副作用。也就是说,当我编写测试时,我的扩展方法可能是这样的:
public static string TrimAll(this string str)
{
return str.Replace(" ", "");
}
测试通过,一切正常。然后,一个月后,当我休假时,一位同事添加了PokeAround 电话。我希望我已经写的测试失败,因为他失败了。
【问题讨论】:
-
这个问题很荒谬。您无法对无权访问的代码进行单元测试。 “在计算机编程中,单元测试是一种测试各个源代码单元以确定它们是否适合使用的方法。单元是应用程序的最小可测试部分。在过程编程中,单元可以是单独的功能或程序。单元测试由程序员或偶尔由白盒测试人员创建。”
-
@WOPR:查看我的更新,了解与此相关的真实场景。
-
这仍然是荒谬的。现在,您正试图扩展单元测试的概念,以防止其他程序员出现白痴。您的“未来同事”也应该对他的更改进行单元测试。您不能使用单元测试来测试未来的更改...他/她也可以删除所有代码并将其更改为删除主引导记录。
-
我想有一种方法 - 对代码文件设置文件权限,以阻止其他编码人员搞乱它。