java - 玩!框架功能测试幽灵数据
问题描述
希望其他人和我有同样的问题,或者有其他想法。
我目前正在运行 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 内存数据库中的数据。但是由于某种原因,控制器方法中没有返回数据。
我尝试过的事情
- 确保夹具只加载一次,这样就不会出现在读取数据时清除数据的竞争条件。
- 使用多种查询数据库的方式通过
nativeQuery
jpql/hql query language
和通过播放本地查询数据的方式。 - 测试不同版本的游戏
任何帮助将不胜感激!
解决方案
此问题发生在功能测试中,因为 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();
....
}
希望它有效!
推荐阅读
- javascript - 应该从前端还是后端进行频繁的外部 API 调用?
- angular - 如何处理覆盖现有翻译的 Angular 11 extract-i18n?
- arrays - 遍历对时如何克服 IndexOutOfBounds 异常
- python - 使用 pandas to_sql 的 if_exists='replace' 将表替换为依赖项
- reactjs - 为什么我创建的每个元素都会被立即删除?
- python - 为什么 OpenCV 和 Matplotlib 在更新显示时会强制延迟?
- android - 在 IOS 中颤振视频流错误,而在 android 设备中工作正常
- google-api - Google Sheets API Oauth 问题
- gpflow - 关于贝叶斯 GP-LVM 实现细节的问题
- html - 无法使用保存在 github 存储库中的自定义 Web 字体