Требования к макету для TryUpdateModel в ASP.Net RC1 - PullRequest
5 голосов
/ 10 февраля 2009

Я нахожусь в процессе написания некоторых модульных тестов для моих контроллеров в 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 (коллега-коллега), а затем проверять свойство ModelState.IsValid?

Если это так, как не найти способ, которым я могу смоделировать свойство ModelState только для чтения из контроллера?

1 Ответ

13 голосов
/ 10 февраля 2009

TryUpdateModel и ModelState требуют ноль макетов в RC 1. Единственное, что вам нужно предоставить - это ValueProvider. Для этого вы можете использовать FormCollection.ToValueProvider ().

Вам все еще нужно будет смоделировать ваш репозиторий, но нет ничего, что вам нужно было бы смоделировать в рамках для этой функциональности. Попробуйте это:

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

    // action

Примечание. Не требуется поддельный HttpContext, если только ваш код этого не требует.

...