首页 > 解决方案 > 玩!框架功能测试幽灵数据

问题描述

希望其他人和我有同样的问题,或者有其他想法。

我目前正在运行 Play 1.4.x(不是选择),但也在努力升级到 Play 1.5.x,尽管我验证了两个版本都发生了同样的问题。我创建了一个简单的功能测试,通过夹具加载数据

我加载测试数据的夹具是这样的

data.yml

User(testUser):
  name: blah

AccessToken(accessToken):
 user: testUser
 token: foo


Data(testData):
 user: testUser
 ...
   

我创建了一个控制器来处理这样的数据,它具有用于身份验证检查的中间件。/foo路线文件将映射类似于BasicController.test

public class BasicController extends Controller{


  @Before
  public void doAuth(){
    String token = "foo"; // Get token somehow from header

    AccessToken token = AccessToken.find("token = ?", token).first(); // returns null;
    // do something with the token


    if(token == null){
     //return 401
    }

    //continue to test()
  }


  public void test(){
     User user = //assured to be logged-in user
     ... // other stuff not important
  }

}

最后我的功能测试是这样的:

 public class BasicControllerTest extends FunctionalTest{

   @org.junit.Before
   public void loadFixtures(){
       Fixtures.loadModels("data.yml");
   }

   
   @Test
   public void doTest(){
      Http.Request request = newRequest()
      request.headers.put(...); // Add auth token to header
      Http.Response response = GET(request, "/foo");
      assertIsOk(response);
   }

 }

现在,我遇到的问题是我可以验证令牌在标头中仍然可见,但是运行AccessToken token = AccessToken.find("token = ?", token).first();返回 null

我在功能测试中验证,然后调用GET通过加载夹具成功创建 accessToken 和用户的方法。通过在 1.5.x 中播放新的 DBBrowser 插件,我可以看到我的 H2 内存数据库中的数据。但是由于某种原因,控制器方法中没有返回数据。

我尝试过的事情

  1. 确保夹具只加载一次,这样就不会出现在读取数据时清除数据的竞争条件。
  2. 使用多种查询数据库的方式通过nativeQuery jpql/hql query language和通过播放本地查询数据的方式。
  3. 测试不同版本的游戏

任何帮助将不胜感激!

标签: javaplayframeworkplayframework-1.x

解决方案


此问题发生在功能测试中,因为 JPA 事务必须封装在作业中以确保事务的结果在您的方法中可见。否则,由于整个功能测试在事务中运行,结果仅在测试结束时可见(请参阅如何在 playframework中为类似情况的功能测试设置数据库/夹具)。

所以你可以试试这个:

@Test
public void doTest() {
    ...
    AccessToken token = new Job<AccessToken>() {
        @Override
        public User doJobWithResult() throws Exception {
            return AccessToken.find("token = ?", tokenId).first();
        }
    }.now().get();
    ....
}

希望它有效!


推荐阅读