Dart:如何模拟和存根Sqflite交易(内部回调)



我正试图通过以下方式模拟sqlite_api.dart的以下方法(https://pub.dev/packages/sqflite):

Future<T> transaction<T>(Future<T> Function(Transaction txn) action, {bool? exclusive});

我对该方法的实施/调整如下:

Future<void> _transaction(Set<DatabaseLocalRequest> payload) async {
await this._api.transaction((txn) async => {
for (final req in payload) {
await txn.rawInsert(req.query.sql, req.query.arguments)
}
});
}

我的db_test.dart使用Mocktail(https://pub.dev/packages/mocktail):

test('if [single] put succeeds', () async {
// SETUP
sut = DatabaseLocalProvider(db: mockDb);
final query = Statement(sql: 'INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');
final req = DatabaseLocalRequest(query: query);
// MOCK
when(() => mockDb.transaction((txn) => txn.rawInsert(req.query.sql, req.query.arguments)))
.thenAnswer((_) async => 1);
// ACT, ASSERT
await sut.put(req: req, bulkReq: null).then((response) => {
expect(response, ...
});
}); // test end

我从控制台得到以下响应错误

type 'Null' is not a subtype of type 'Future<Set<Set<int>>>'

如何截断应该用Future<Set<Set<int>>>{{1}}响应的内部txn.rawInsert()方法?

提前感谢!

我可能没有完全回答你的问题,但你可以通过使用sqflite_common_ffi的真实实现来模拟sqflite,因为它在dart VM上的所有桌面(MacOS、Linux、Windows)上都可以工作,所以在flutter和dart单元测试中也可以:

更多信息请点击此处:https://pub.dev/packages/sqflite_common_ffi#unit-测试代码

一种解决方案是为每个测试在内存中打开一个数据库,以便从一个空数据库开始。

import 'package:test/test.dart';
import 'package:sqflite_common/sqlite_api.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
void main() {
// Init ffi loader if needed.
sqfliteFfiInit();
test('simple sqflite example', () async {
var db = await databaseFactoryFfi.openDatabase(inMemoryDatabasePath);
expect(await db.getVersion(), 0);
await db.close();
});
}
when(() => mockDb.transaction(any())).thenAnswer((_) async => {{1}});
when(() => mockDb.rawInsert(any())).thenAnswer((_) async => 1);

这就成功了!但它不是100的解决方案,因为闭包不是存根,而是绕过的。

最新更新