如何在 Play Framework 2.5 上测试表单?

Val*_*lva 5 playframework playframework-2.0

我是新手,所以我在这里PlayFramework阅读相关内容。但是,该链接适用于旧版本:2.1.1

@Test
public void authenticateSuccess() {
    Result result = callAction(
        controllers.routes.ref.Application.authenticate(),
        fakeRequest().withFormUrlEncodedBody(ImmutableMap.of(
            "email", "bob@example.com",
            "password", "secret"))
    );
    assertEquals(302, status(result));
    assertEquals("bob@example.com", session(result).get("email"));
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在当前版本中会是什么样子2.5

Val*_*lva 4

对于那些可能处于相同情况的人,以下是我解决问题的方法:

@Test
public void authenticateAndRedirect() {
    Result result = route(new Http.RequestBuilder()
            .method(POST)
            .bodyForm(ImmutableMap.of("email", "valter@example.com", "password", "secret"))
            .uri(controllers.routes.ApplicationController.authenticate().url()));
    assertEquals(SEE_OTHER, result.status());
}

@Test
public void authenticateAndRedirectJson() throws Exception {

    JsonNode jsonNode = (new ObjectMapper()).readTree("{ \"email\": \"valter@example.com\", \"password\": \"secret\"  }");
    Http.RequestBuilder request = new Http.RequestBuilder()
            .method("POST")
            .bodyJson(jsonNode)
            .uri(controllers.routes.ApplicationController.authenticate().url());
    Result result = route(request);

    assertEquals(SEE_OTHER, result.status());
}
Run Code Online (Sandbox Code Playgroud)

请记住,一旦用户通过身份验证,我就会将其重定向到另一个页面,这就是为什么我需要代码SEE_OTHER=303

public Result authenticate() {
    Form<Login> form = formFactory.form(Login.class).bindFromRequest();

    if (form.hasErrors()) {
        return badRequest(login.render(form));
    }

    Optional<User> maybeUser = User.findByEmail(form.get().email);

    if (maybeUser.isPresent()) {
        session("email", maybeUser.get().email);
        return redirect(routes.ApplicationController.index());
    }

    return badRequest(login.render(form));
}
Run Code Online (Sandbox Code Playgroud)