Помощник по тестированию mvccontrib и проверка маршрутов и параметров HTTP-сообщений

Вот пример. Предполагая, что у вас есть следующее действие:

public AccountController : Controller
{
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Foo(string id) 
    {
        return View();
    }
}

И зарегистрирован следующий маршрут:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "home", action = "index", id = "" }
);

Тестирую вот так:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

Но это тоже работает с Get, и работать не обязательно:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Get);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

Почему?

ОБНОВЛЕНИЕ 1:

Мои настоящие методы:

public ActionResult Novo()
{
    NovoViewModel novoViewModel = new NovoViewModel();
    novoViewModel.Sexos = GetSexos();
    novoViewModel.Status = GetStatus();

    return View(novoViewModel);
}

[HttpPost]
public ActionResult Novo(NovoViewModel novoViewModel)
{
    //Validações de autenticação
    if (_authenticationService.IsUserRegistered(novoViewModel.NomeUsuario))
    {
        ModelState.AddModelError("ExistingUsername", String.Format(ViewModelValidations.ExistingUsername, "Usuário"));
    }

    if (_usuarioRepository.PegaUsuarioPorEmail(novoViewModel.Email) != null)
    {
        ModelState.AddModelError("ExistingEmail", String.Format(ViewModelValidations.ExistingEmail, "Email"));
    }

    if (ModelState.IsValid) {
        Usuario usuario = new Usuario()
                                {
                                    Nome = novoViewModel.Nome,
                                    Email = novoViewModel.Email,
                                    Telefone = novoViewModel.Telefone,
                                    DataNascimento = Convert.ToDateTime(novoViewModel.DataNascimento),
                                    Sexo = !String.IsNullOrEmpty(novoViewModel.SexoSelecionado) ? (Sexo?)(Convert.ToByte(novoViewModel.SexoSelecionado)) : null,
                                    Credencial = new Credencial()
                                                    {
                                                        NomeUsuario = novoViewModel.NomeUsuario,
                                                        Senha = novoViewModel.Senha,
                                                        Status = (Status)Convert.ToByte(novoViewModel.SexoSelecionado)
                                                    }
                                };

        _usuarioRepository.Add(usuario);

        _dbContext.SaveChanges();

        return RedirectToAction("Index");
    }

    novoViewModel.Sexos = GetSexos();
    novoViewModel.Status = GetStatus();

    return View(novoViewModel);
}

person Acaz Souza    schedule 23.08.2011    source источник
comment
вы можете показать нам свой метод действия GET?   -  person frennky    schedule 24.08.2011
comment
Мне интересно то же самое, я не понимаю, что делает .WithMethod и как я должен его использовать.   -  person Mike D    schedule 03.11.2011


Ответы (1)


Попробуйте ввести идентификатор в URL-адрес, который вы тестируете:

var routeData = "~/account/foo/123".WithMethod(HttpVerbs.Post);
person frennky    schedule 23.08.2011
comment
Нет, моя страница размещает сообщение на той же странице: ~ / account / foo / - person Acaz Souza; 24.08.2011