0

コントローラーの動作をテストしたいのですが、Visual Studio のコード カバレッジ ツールで 1 つの点がカバーされていません。

    public ActionResult Activate(int? id)
    {
        if (id == null)
            return View("PageNotFound");

        var city = repository.GetCityById(id.Value);

        if (city == null)
            return View("PageNotFound");


        city.IsActive = !city.IsActive;

        if (TryUpdateModel(city))
        {
            repository.Save();
            return RedirectToAction("MyCities");
        }

        ***return View("PageNotFound");***
    }

コード カバレッジでは、* return View("PageNotFound");対象外です。なぜなら、TryUpdateModel の false 状態をシミュレートできないからです。モデルを更新できない場合、TryUpdateModel は false になる可能性があります。これについて助けてもらえますか?

4

4 に答える 4

0

OK、解決しました。TryUpdatemodel if 条件を削除しました。直接使用される repository.Save() メソッド。メソッドをアクティブ化するモデルにパラメーターを送信しなかったためです。

于 2012-09-17T17:55:08.247 に答える
0

TryUpdateModelモデルの検証が失敗した場合は false を返します。
(この場合、見つからないページを表示すべきではありません)

于 2012-09-09T18:15:47.357 に答える
0

cargo依存関係の存続期間がどのように処理されるかを示すコードが含まれていないので、推測にすぎませんが...

テスト セットアップの一部として、このクラスのモックまたはフェイク インスタンスをコントローラーに渡すことができるはずです (現在それができない場合は、できるようになるまでリファクタリングしてください)。

モックを配置すると、必要に応じて動作を分離してテストできます。

余談ですが、@dreza からのコメントには同意しません... この種のビジネス ロジックをテストすることは非常に重要です。

また、@Vitaliy によって提案されているように、TryUpdateModel の実装を偽造しないように注意します。これは、貨物モデルが無効な場合に何が起こるかをテストする必要があるためです (新しいバージョンのコアコードを提供することによって無効であると偽るだけではありません)。

于 2012-09-10T07:56:49.363 に答える
0

このような状況では、あらゆる種類のオプションがあります。そのうちの 1 つは、制御するメソッドの実際の機能をオーバーライドするスタブを作成することです。

たとえば、TryUpdateModel仮想として宣言できます。単体テストでは、元のクラスを操作する代わりに、それを継承し、TryGetModel をオーバーライドして単に false を返します。他のすべての機能はそのまま保持されます。

Activate次に、シミュレートされたメソッドとは別に、まったく同じ機能を持つ派生クラスのメソッドを呼び出すことTryUpdateModelで、特定の実行パスをシミュレートする方法について頭を悩ませることなく、目的のユース ケースをテストできます。

この手法には欠点がないわけではありません。テスト目的でのみメソッドを仮想として宣言するため、封印または静的にすることができなくなります。他にもより高度な手法 (モック オブジェクト分離フレームワーク) がありますが、このシナリオではこれで十分な解決策だと思います。

于 2012-09-09T18:58:41.727 に答える