私はしばらくの間、ユニットテストを無視しました。私はユニットテストを書いたが、かなり貧弱だった。 私は自分自身をスクラッチに持ち込むために、 "The Unit Testingの技術"を通して読んでいます。私のようなインターフェースを持っている場合2つの機能を使用したユニットテスト
は:
public interface INotificationService
{
void AddError(string _error);
void AddIssue(string _issue);
IEnumerable<string> FetchErrors();
IEnumerable<string> FetchIssues();
}
をこのインタフェースの具体的な実装が含まれています
private readonly ICollection<Message> messages;
エラーまたは問題を追加すると、それのタイプを示す列挙型を使用して新しいメッセージを作成し、それをコレクションに追加します。 FetchErrors()を呼び出す/ FetchIssues()は、その型のメッセージをコレクションから返します。
次のテストが有効だろう?:
[Test]
public void FetchErrors_LoggingEnabledAddErrorFetchErrors_ReturnsError()
{
notificationService = new NotificationService();
notificationService.AddError("A new error");
Assert.AreEqual(new []{"A new error"}, notificationService.FetchErrors());
}
私の関心は)(私が最初FetchErrorsの結果をテストし、その後、)(AddErrorを呼んでいるということです。だから私は2つの関数を呼び出しています。これは間違っていますか?
コレクションをパブリックにし、ログに記録されたエラーメッセージを含む適切なタイプのメッセージが含まれていることを直接宣言する必要がありますか?
このシナリオでのベストプラクティスは何ですか?
こんにちはStuartLC、返信いただきありがとうございます。その理由は、Roy Osheroveの本では、テスト中のクラスの新しいインスタンスをインスタンス化するようなことを提案していますが、プライベートメンバーを公開して、単一の機能のテストをより簡単にすることを提案しています。私は自分の仕事の例に関して、これをどのくらいまでとらえているのかは分かりませんでした。 –