1

私は単体テストにかなり慣れていないため、このケースを適切にテストする方法 (またはテストする必要がある場合) を回避できません。

私はコントローラーメソッド(疑似コード)を持っています:

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を使用したテストはこれを満たすのに十分でしょう...

4

1 に答える 1

1

モックは、共同作業を行うクラスを表します。モックとスタブの違いにあまりこだわることはありません。それはまだ共同クラスです。

単体テストは、クラスの使用方法と、クラスがコラボレーターとどのように対話するかを記述するものと考えることができます。2 つの例があります。

Given a controller
When I register the model
Then the class should ask the user service to create a user.

と:

Given a controller
Given the user service is broken
When I register the model
Then the class should attach the error to the model state.

Givenあざけるのではなく、スタブしていることを伝えるのはその秒です。ユーザーサービスが壊れているかのように設定しています。クラスが動作するコンテキストは異なるため、スタブする必要があり、実際に例外をスローする必要があります。

これらの行をテスト内のコメントとして配置すると、意味があります。それが理にかなっている場合は、その本を無視してください。

ところで、これはユニットレベルの BDD です。シナリオ レベルと同じようにユニット レベルでも "Given, When, Then" を使用でき、テストのロジックを考えるのに役立つ場合があります。これには BDD シナリオ ツールを使用しないでください。

于 2011-04-14T07:32:52.787 に答える