我们正在使用mongodb-prebuilt
包来执行开发软件的单元/集成测试(CI / CD),该软件与mongodb数据库进行交互。
常见用例如下:使用prebuild包启动测试mongodb服务器,执行测试套件执行,然后终止服务器。第一和第二项很容易完成,但第三项会导致一些问题。
如果mongodb-prebuilt
- 已启动的服务器尚未终止,则测试运行器将永久挂起。相反,如果尝试通过testConnection.command({ shutdown: 1 })
命令终止服务器,则unhandledRejection
将触发,这将在关闭的连接上引用 - 当然,这已通过停止服务器强制关闭。
在mongodb-prebuilt
测试部分处理afterAll
的正确方法是什么?测试引擎为jest
,但无关紧要
示例代码:
import { MongodHelper } from 'mongodb-prebuilt';
import { MongoClient } from 'mongodb';
describe('Test suite', () => {
let testConnection;
beforeAll(async () => {
const mongodHelper = new MongodHelper(['--port', "27018"]);
await mongodHelper.run();
testConnection = await MongoClient.connect(`mongodb://localhost:27018/admin`);
});
afterAll(async () => {
await testConnection.dropDatabase();
await testConnection.command({ shutdown: 1 });
await testConnection.close();
testConnection = null;
});
/* Here follows some test suite that uses testConnection */
}
有一些尝试解决问题:
1)不要等待testConnection.command({ shutdown: 1 })
生成的承诺,并立即启动客户端连接关闭 - 它可以在某些机器上运行,但很可能取决于执行速度,因此工作不稳定。
2)由于测试结束时客户端连接终止无关紧要 - 可以在process.on('unhandledRejection', ...)
部分设置afterAll
处理程序,只是将异常静音 - 效果很好,但似乎是意识形态不正确
那么,也许是原型任务的定型解决方案?
重要提示:建议使用一些模拟软件包而不是live mongodb
根本不合适,因为开发的软件是mongodb
的特定适配器,应该尊重现场的所有方面数据库,包括时间,管理命令等
答案 0 :(得分:0)
最原始问题的最方便的解决方案是使用holder.preferiti.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onImageClickListener.onPreferitiClick2(video2.getPic(), video.getTitolo(), video.getSottotitolo(), video.getData(), iddd);
// holder.preferiti.setVisibility(View.GONE);
holder.preferiti.setColorFilter(Color.RED);
System.out.println("dentro adapter 2:" + video2.getPic() + video.getTitolo() + video.getSottotitolo() + video.getData() + iddd);
}
});
npm包,尽管有名称,它提供了用于使用真正的mongodb预构建服务器进行自动集成测试的API,包括启动和停止它:https://github.com/mikhail-angelov/mongo-unit/
带有mongo-unit
的Gauge测试套件如下所示:
mongo-unit
Package还允许在启动时选择初始数据库,并在测试套件结束时执行清除mongodb服务器进程。