5

RC1 でコントローラーの単体テストを作成中です。私がテストしているコントローラーの公開署名は次のとおりです。

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AcceptColleague()
    {

AcceptColleague 内の実装では、TryUpdateModel(colleague) メソッドを使用して、フォーム フィールドから Colleague オブジェクトを設定します。ただし、メソッドを単体テストしようとすると、TryUpdateModel 行で「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

これが私の単体テストコードです:

            // definition
        HomeController controller = new HomeController();
        IColleagueRepository fakeColleagueRepo = MockRepository.GenerateMock<IColleagueRepository>();
        Colleague requestedColleauge = new Colleague();
        EmployeeInfo currentUser = new EmployeeInfo();            
        HttpContextBase fakeHttpContext = MockRepository.GenerateMock<HttpContextBase>();
        HttpRequestBase fakeHttpRequest = MockRepository.GenerateMock<HttpRequestBase>();
        ControllerContext fakeContext = MockRepository.GenerateMock<ControllerContext>(fakeHttpContext, new RouteData(), controller);
        NameValueCollection fakeForm = new NameValueCollection();

        // expectations
        fakeColleagueRepo.Expect(c => c.Read(1234)).Return(requestedColleauge);
        fakeColleagueRepo.Expect(c => c.Update(requestedColleauge));
        fakeColleagueRepo.Expect(c => c.Add(new Colleague())).IgnoreArguments().Constraints(Is.NotNull());
        fakeContext.Expect(cx => cx.HttpContext).Return(fakeHttpContext);
        fakeHttpContext.Expect(hcx => hcx.Request).Return(fakeHttpRequest);
        fakeHttpRequest.Expect(hr => hr.Form).Return(fakeForm);

        // setup
        controller.ColleagueRepository = fakeColleagueRepo;
        controller.ControllerContext = fakeContext;
        requestedColleauge.TargetEmployeeInfoId = 123456;
        requestedColleauge.GeneratedEmployeeInfoId = 654321;
        currentUser.EmployeeInfoId = 123456;
        fakeForm.Add("ColleagueId", "22222");

        // action
        RedirectToRouteResult result = controller.AcceptColleague() as RedirectToRouteResult;

        // validation
        Assert.IsNotNull(result, "AcceptColleague() did not return RedirectToRouteResult");

モックで何かが足りないのでしょうか、それとも AcceptColleague(Colleague colleague) のような別のパブリック署名を使用して ModelState.IsValid プロパティをテストする必要がありますか?

もしそうなら、コントローラーから読み取り専用の ModelState プロパティをモックする方法がわかりませんか?

4

1 に答える 1

13

RC 1では、TryUpdateModel と ModelState の両方にゼロモックが必要です。指定する必要があるのは、ValueProvider だけです。そのために、FormCollection.ToValueProvider() を使用できます。

リポジトリをモックする必要がありますが、この機能のためにフレームワークでモックする必要はありません。これを試して:

    FormCollection fakeForm = new FormCollection();
    fakeForm.Add("ColleagueId", "22222");
    controller.ValueProvider = fakeForm.ToValueProvider();

    // action

注: コードで必要な場合を除き、モック化された HttpContext は必要ありません。

于 2009-02-09T21:53:39.073 に答える