私の意見では、私は状態を好む傾向があります。その理由は次のとおりです。1.状態ベースの検証は、よりシンプルで理解しやすいです。2.状態ベースの検証は「AAA」モデルを使用します。3.動作ベースの検証は、状態ベースよりもリファクタリングに影響します。どう思いますか?それらのいずれかまたは両方を使用しますか?なんで?
1 に答える
私の経験からすると、状態ベースのテストは、より読みやすく保守しやすいテストを生成し、従うのも簡単です。もちろん、動作ベースの検証には用途がありますが、状態ベースが利用できない場合にのみ頼るべきだと思います。
当然のことながら、動作ベースの検証を状態ベースの検証に置き換えることは可能ですが、そうすることが時間とお金の価値があるかどうかを常に判断する必要があります。シンプルなアラート発生サービスを検討してください。
public void RaiseAlert(string message)
{
var alert = builder.CreateAlert();
alert.IsSystemWide = true;
alert.Content = CreateAlertContent(message);
var receivers = GetAlertReceivers(alert);
smsService.SendSmsAsync(alert.Content, receivers);
emailService.SendEmailAsync(alert.Content, receivers);
}
メソッドの単体テストの 1 つで、RaiseAlert
SMS が送信されたことを確認する必要があることは容易に推測できます。状態検証を使用してどのようにそれを行いますか? ここには観察可能な状態変化はありません。独自のモックを作成し、メソッドが呼び出されたことを示す bool フィールドを設定する必要があります。または、モック フレームワークを使用して、動作ベースの検証を行います。
可能な限り、状態ベースの検証を使用してください。ほとんどの場合、追跡が容易になります。より複雑な少数派にとっては、行動ベースの検証を求めるのに適しているかもしれません。
補足として、動作検証もAAAアプローチを利用します。最後の A ( assert ) がverifyに置き換えられただけですが、目的はまったく同じです。