2

NerdDinner ソリューションに単体テストを追加していて、これに出くわしました。ここで指定された Edit POST メソッドをテストしています。

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public virtual ActionResult Edit(int id, FormCollection formValues)
    {
        Dinner dinner = dinnerRepository.GetDinner( id );
        if (!dinner.IsHostedBy(User.Identity.Name))
        {
            return View(Views.InvalidOwner);
        }
        try
        {
            UpdateModel(dinner);
            dinnerRepository.Save();

            //return RedirectToAction("Details", new { id = dinner.DinnerID });
            return RedirectToAction(Actions.Details(dinner.DinnerID));
        }
        catch (Exception ex)
        {
            foreach (var issue in dinner.GetRuleViolations())
            {
                ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }
            return View(new DinnerFormViewModel(dinner));
        }
    }

System.TypeInitializationException が「return RedirectToAction...」行でスローされ、「'MVC' の型初期化子が例外をスローしました」と表示されます。

T4MVC でエンコードされた行を元の行 (上記でコメントアウト) に置き換えると、例外が発生しません。

ユニットテストコードは次のとおりです。

    [TestMethod]
    public void EditAction_Should_Redirect_When_Update_Successful()
    {
        // Arrange
        var controller = CreateDinnersControllerAs("Some User");
        var formValues = new FormCollection
                             {
                                 { "Title", "Another Value" },
                                 { "Description", "Another Description" }
                             };
        controller.ValueProvider = formValues.ToValueProvider();

        // Act
        var result = controller.Edit(1, formValues) as RedirectToRouteResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Details", result.RouteValues["Action"]);
    }

この例外がスローされる原因となる可能性のあるアイデアがいくつかありますが、ここで推測するのに十分ではありません。どのように修正するかについては、まったく不明です。

アイデア?

デイブ

4

2 に答える 2

2

MVC は T4MVC によって生成されるクラスです。表示されているエラーは、この生成された MVC クラスのコンストラクター内で例外がスローされたことを意味します (この意味での「コンストラクター」は、宣言された場所で値が割り当てられているフィールドの初期化も意味することに注意してください)。

T4MVC.tt ファイルを開いて保存し、コード生成ファイルが最新であることを確認します。それでも問題が解決せず、利用可能な最新バージョンを使用している場合は、生成された MVC クラスのコンストラクターにブレークポイントを設定して、何が壊れているかを調べます。

于 2011-03-09T18:43:15.590 に答える
0

私の後に続く人のために、T4MVC を使用すると、テスト プロセスに相互依存関係が導入されます。基本的に、T4MVC はすべてのコントローラーに対して新しい部分クラスを生成するため、問題が発生する可能性があります。私の場合、MVC コンストラクターは RSVPController を作成しようとしていましたが、まだ触れていなかったので、まだデータベースに接続しようとしていました。T4MVC がすべてに影響するため、単体テスト用に個別のコントローラーを分離する方法がわかりません。アイデアがあれば教えてください...

デイブ

于 2011-03-10T17:04:56.757 に答える