私は単体テストにかなり慣れていないため、このケースを適切にテストする方法 (またはテストする必要がある場合) を回避できません。
私はコントローラーメソッド(疑似コード)を持っています:
public ActionResult Register(formModel model)
{
if (ModelState.isValid) {
try {
_userService.CreateUser(a bunch of parameters here);
return RedirectToAction(some other action);
}
catch (Exception e)
{
ModelState.AddModelError("",e.Message);
}
}
return View();
}
「_userService」に対する個別のテストがたくさんあります。「CreateUser」メソッドは、新しいユーザーを作成するだけで、何も返さないか、try catch でコントローラー サラウンドにバブルアップして例外を ModelState に追加するエラー (ユーザーが存在するなど) があった場合に例外をスローします。
私が理解していることから、サービスをモックし、それが正しく呼び出されたことをアサートする必要があります (私は assertwascalled 構文を使用します)。
よくわからないのは、ユーザーサービスがエラーをスローしたときにリダイレクトせず、その例外をモデル状態に追加する必要があることをテストする方法です。rhino モックを使用すると、モックをスタブ化できますが、単体テストのブック アートでは、それを避けるようにアドバイスされています。
現在、私のテストでは、手動でモデル エラーを追加し (ユーザー サービスからのものかどうかは気にしません)、エラーが発生した場合にコントローラーが同じビューを返すことをテストします。これは正しい方法ですか?または、_userService をスタブしてエラーをスローし、それがモデル状態に追加されることを確認する別のテストを作成する必要がありますか? それとも、そのケースをテストするべきではありませんか? 私は全体を分析しすぎているように感じます.modelstateを使用したテストはこれを満たすのに十分でしょう...