当前位置:  开发笔记 > 编程语言 > 正文

在ASP.Net RC1中模拟TryUpdateModel的要求

如何解决《在ASP.NetRC1中模拟TryUpdateModel的要求》经验,为你挑选了1个好方法。

我正在为RC1中的控制器编写一些单元测试.这是我正在测试的控制器的公共签名:

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

AcceptColleague中的实现使用TryUpdateModel(同事)方法从表单字段填充Colleague对象.但是,在尝试对方法进行单元测试时,我在TryUpdateModel行上遇到"未设置为对象实例的对象引用"错误.

这是我的单元测试代码:

            // definition
        HomeController controller = new HomeController();
        IColleagueRepository fakeColleagueRepo = MockRepository.GenerateMock();
        Colleague requestedColleauge = new Colleague();
        EmployeeInfo currentUser = new EmployeeInfo();            
        HttpContextBase fakeHttpContext = MockRepository.GenerateMock();
        HttpRequestBase fakeHttpRequest = MockRepository.GenerateMock();
        ControllerContext fakeContext = MockRepository.GenerateMock(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(同事同事),然后测试ModelState.IsValid属性?

如果是这样,怎么看不到我可以模拟控制器的只读ModelState属性?



1> Craig Stuntz..:

TryUpdateModel和ModelState都需要在RC 1中进行模拟.您唯一需要提供的是ValueProvider.为此,您可以使用FormCollection.ToValueProvider().

您仍然需要模拟您的存储库,但是您无需在框架中模拟此功能.试试这个:

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

    // action

注意:除非您的代码需要,否则不需要模拟的HttpContext.


实际上你需要提供一个上下文,如果你没有得到ArgumentNullException,Value不能为null.参数名称:controllerContext
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有