どのコードも副作用をもたらす可能性があります。ほとんどの場合、副作用は設計が悪いことやリファクタリングが必要であることを示している可能性がありますが、単体テストを行うときは、それに対してテストするのが難しいと感じています。次の例を検討してください。
[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
テストを作成する時点でソースがあるため、完全に不明である可能性が非常に低いシナリオ
について、いくつかのコメントがありました。しかし、私がこの質問をした理由は、後で追加される副作用を防ぐ方法を見つけるためでした. つまり、テストを書くとき、拡張メソッドは次のようになります。
public static string TrimAll(this string str)
{
return str.Replace(" ", "");
}
テストに合格しました。すべて問題ありません。それから 1 か月後、私が休暇を取っているときに、同僚からPokeAround
電話がかかってきました。彼がやったので、私はすでに書いたテストが失敗することを望んでいます。