Play Framework 1.5 带@AllowFeature注解的控制器功能测试配置问题
Play Framework 1.5 权限接口功能测试配置方案
你的测试返回302是因为请求被@AllowFeature对应的权限拦截器拦截,未进入控制器方法,因此renderArgs中不存在对应参数。按照以下步骤配置即可解决:
1. 前置配置:模拟用户身份与权限
@AllowFeature校验依赖用户权限上下文,需要在测试执行前初始化用户身份、权限以及CSRF令牌:
public class SearchTest extends FunctionalTest { @Before public void beforeTest() { // 初始化会话,注入测试用户标识 Session session = Session.current(); session.put("userId", "10001"); session.put("username", "test_admin"); // 初始化用户上下文,确保用户拥有SEARCH_BOX权限 UserContext testContext = new UserContext(); testContext.addPermission(Feature.SEARCH_BOX); UserContext.set(testContext); // 生成并注入authenticityToken,避免CSRF校验拦截 String csrfToken = Crypto.sign(Long.toString(System.currentTimeMillis())); session.put("authenticityToken", csrfToken); } }
2. 修正测试请求逻辑
请求时携带CSRF令牌,同时调整响应码断言(权限通过后接口正常返回应为200而非302):
@Test public void search_withResults() { String term = "ABC"; String csrfToken = Session.current().get("authenticityToken"); // 请求路径携带authenticityToken参数 Http.Response response = GET("/foo/search?term=" + term + "&authenticityToken=" + csrfToken); // 校验接口正常响应 assertStatus(200, response); assertThat(renderArgs("page"), is(notNullValue())); TablePage<MyAwesomeType> page = (TablePage<MyAwesomeType>) renderArgs("page"); assertTrue(page.getTotalRecords() >= 1); }
额外注意事项
- 如果
SEARCH_BOX是功能开关控制的能力,需要在测试环境的application.conf中添加对应开关的开启配置,或者在测试代码中手动修改开关状态。 - 若你项目的CSRF校验是通过请求头传递token,可在调用
GET方法时传入自定义请求头,无需拼接在URL参数中。
内容的提问来源于stack exchange,提问作者Emanuel Gitterle
相关产品推荐
相关产品推荐

