我正在尝试使用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()
方法上,这让我怀疑我的操作方式是否正确。
您应该看看依赖注入,这不是测试东西的正确方法。测试可能会挂起,因为它无法与该地址的Firebase通信。
每次你有一段代码很难测试,要么是因为它很慢,要么是需要网络访问(API、数据库等(,你都应该嘲笑它
我建议您查看Mockito和提供商包。
使用Provider将依赖项(在本例中为Firebase.instance
(注入到实际代码中,在测试时,您可以注入实际上什么都不做的Firebase的mock,而使用Mockito,并且仍然验证对Firebase的所有调用是否正确。