如何解决如何在扑朔迷离中模拟FirebaseApp
我正在尝试测试使用FirebaseFirestore的方法,但无法模拟FirebaseFirestore.instance属性。
我正在关注以下示例:
- 初始化核心:https://firebase.flutter.dev/docs/overview#initializing-flutterfire
- 使用firestore插件:https://firebase.flutter.dev/docs/firestore/usage
我正在为我的课程使用下面的代码,它运行良好,这意味着firestoreInstance已正确加载
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(
Main(firebaseApp: Firebase.initializeApp()),);
}
class Main extends StatelessWidget {
final Future<FirebaseApp> firebaseApp;
const Main({this.firebaseApp});
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: firebaseApp,builder: (context,snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
final firestoreInstance = FirebaseFirestore.instanceFor(
app: snapshot.data,);
return MyWidget();
}
return CircularProgressIndicator();
},);
}
}
但是当我运行下面的测试时,我收到消息:
“在构建Builder(dirty)时引发了以下FirebaseException: [core / no-app]尚未创建Firebase应用程序'[DEFAULT]'-调用Firebase.initializeApp()“
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
class MockFirebaseApp extends Mock implements FirebaseApp {}
void main() {
FirebaseApp firebaseApp;
setUp(() async {
TestWidgetsFlutterBinding.ensureInitialized();
firebaseApp = MockFirebaseApp();
});
group('Main',() {
testWidgets('Loads my widget',(WidgetTester tester) async {
await tester.runAsync(() async {
await tester.pumpWidget(
Main(firebaseApp: Future.value(firebaseApp)),);
expect(find.byType(CircularProgressIndicator),findsOneWidget);
});
});
});
}
解决方法
也许 cloud_firestore_mocks 包对您有用:
假冒为 Cloud Firestore 编写单元测试。实例化一个 MockFirestoreInstance,然后将它传递给您的项目,就好像它是一个 FirestoreInstance。这个伪造的行为类似于 Firestore,只是它只会将状态保存在内存中。为了帮助调试,您可以使用 MockFirestoreInstance.dump() 来查看假数据库中的内容。这对于设置您的数据库状态,然后检查您的 UI 的行为是否符合您的预期非常有用。
文档中的示例:
import 'package:cloud_firestore_mocks/cloud_firestore_mocks.dart';
void main() {
final instance = MockFirestoreInstance();
await instance.collection('users').add({
'username': 'Bob',});
final snapshot = await instance.collection('users').get();
print(snapshot.documents.length); // 1
print(snapshot.documents.first['username']); // 'Bob'
print(instance.dump());
}
,
想将FutureBuilder用作树的根小部件或根小部件,扑动总是需要一个MaterialApp或其他(现在不要记住)。
建议,重构FutureBuilder->包装丝毫小部件-> MaterialApp(home:FutureBuilder(...
并检查MyWidget()第一个小部件,可能是相同的MaterialApp出错,但不确定。
如果您使用路由方法进行导航,请使用initialRoute。
好运!
,我有同样的问题。使用this answer找到了解决方案。
-
将https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_auth/firebase_auth/test/mock.dart的内容复制到一个文件中,您可以将其导入到测试中,以在其中初始化Firebase应用程序。
-
调用
setupFirebaseAuthMocks();
函数顶部的main
进行所有测试。 -
在您的
setUpAll
函数中,调用await Firebase.initializeApp();
(您也可以将其放在main
下的setupFirebaseAuthMocks();
函数中。)
现在您应该有一个模拟的Firebase应用程序。
这是一个完整的例子:
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_test/flutter_test.dart';
import '../lib/authentication/your_auth_using_firebase.dart';
import './mock.dart'; // from: https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_auth/firebase_auth/test/mock.dart
void main() {
// TestWidgetsFlutterBinding.ensureInitialized(); Gets called in setupFirebaseAuthMocks()
setupFirebaseAuthMocks();
setUpAll(() async {
await Firebase.initializeApp();
});
testWidgets('Your Test',(WidgetTester tester) async {
final YourFirebaseAuthClass authService = YourFirebaseAuthClass();
// Tests to write
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。