任何代码都可能产生副作用。大多数时候,副作用可能是糟糕设计和/或需要重构的标志,但在单元测试时,我发现很难进行测试。考虑以下示例:
[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
认为完全未知是一种非常不可能的情况,因为我们在编写测试时有来源。不过,我问这个问题的原因是想找到一种方法来防止后来添加的副作用。也就是说,当我编写测试时,我的 exension 方法可能如下所示:
public static string TrimAll(this string str)
{
return str.Replace(" ", "");
}
测试通过,一切正常。然后,一个月后,当我休假时,一位同事添加了PokeAround
电话。我希望我已经写的测试失败,因为他做到了。