单元测试中的 Play Framework csrf 令牌生成
Play Framework csrf token generation in unit test
我有两个单元测试因“[RuntimeException:缺少 CSRF 令牌]”而失败:
running(testServer(3333, provideFakeApplication()), () -> {
assertThat(WS.url("http://localhost:3333").get().get(3000).getStatus()
).isEqualTo(OK);
和
running(testServer(3333, provideFakeApplication()), HTMLUNIT, browser -> {
browser.goTo("http://localhost:3333");
assert....
如何将带有 CSRF 令牌的会话添加到 WS.url 和 browser.goTo?
测试正在尝试访问具有表单的页面。
一个全局解决方案是使用启用了 CSRF 过滤器的假应用程序。为此,您需要修改(即创建一个继承自 WithApplication
并覆盖的 class)您的 provideFakeApplication()
,例如它会创建传入全局设置的假应用程序:
public abstract class TestWrapper extends WithApplication {
public class GlobalTestSettings extends play.GlobalSettings {
@Override
public <T extends EssentialFilter> Class<T>[] filters() {
return new Class[] { CSRFFilter.class };
}
}
@Override
protected FakeApplication provideFakeApplication() {
stop(fakeApplication()); // Stop the existing fake app and start over
Map<String, String> addConfig = new HashMap<>();
return fakeApplication(addConfig, new GlobalTestSettings());
}
}
我有两个单元测试因“[RuntimeException:缺少 CSRF 令牌]”而失败:
running(testServer(3333, provideFakeApplication()), () -> {
assertThat(WS.url("http://localhost:3333").get().get(3000).getStatus()
).isEqualTo(OK);
和
running(testServer(3333, provideFakeApplication()), HTMLUNIT, browser -> {
browser.goTo("http://localhost:3333");
assert....
如何将带有 CSRF 令牌的会话添加到 WS.url 和 browser.goTo?
测试正在尝试访问具有表单的页面。
一个全局解决方案是使用启用了 CSRF 过滤器的假应用程序。为此,您需要修改(即创建一个继承自 WithApplication
并覆盖的 class)您的 provideFakeApplication()
,例如它会创建传入全局设置的假应用程序:
public abstract class TestWrapper extends WithApplication {
public class GlobalTestSettings extends play.GlobalSettings {
@Override
public <T extends EssentialFilter> Class<T>[] filters() {
return new Class[] { CSRFFilter.class };
}
}
@Override
protected FakeApplication provideFakeApplication() {
stop(fakeApplication()); // Stop the existing fake app and start over
Map<String, String> addConfig = new HashMap<>();
return fakeApplication(addConfig, new GlobalTestSettings());
}
}