我正在尝试使用Firestore Emulator编写单元测试。
我已经使用以下命令启动了模拟器:
firebase emulators:start --only firestore
测试如下:
testWidgets('should retrieve correct item', (tester) async {
await Firestore.instance.settings(
host: "127.0.0.1:8080",
sslEnabled: false,
persistenceEnabled: false,
);
var ref = await Firestore.instance
.collection('books')
.add({ 'title': 'title'});
// Fetch item by id
var resp = await Firestore.instance
.collection('books')
.document(ref.documentID)
.get();
expect(resp, isNotNull);
});
问题是代码挂在.settings()
方法上,并且从不进行下一步。
有趣的是,当我停止仿真器时,测试的行为相同并且挂在.add()
方法上,这让我想知道我的操作方法是否正确。
答案 0 :(得分:2)
您应该看看Dependency Injection,这不是测试内容的正确方法。可能由于无法在该地址与Firebase通信而导致测试挂起。
每次您都有一段很难测试的代码,要么因为它很慢,要么需要网络访问(API,数据库等),您应该mock。
使用Provider将依赖项(在这种情况下为Firebase.instance
)注入您的实际代码中,并且在测试时,您可以注入模拟的Firebase,该模拟实际上不执行任何操作,而是使用Mockito并仍然验证对Firebase的所有调用都是正确的。 / p>