【发布时间】:2020-12-19 01:19:26
【问题描述】:
我正在尝试测试使用 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(脏)时引发了以下 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);
});
});
});
}
【问题讨论】:
-
不,这个链接显示了如何实现这个类,我就是这样做的,它就像一个魅力。我的问题出在单元测试中,因为我不知道如何模拟 Firebase.initializeApp() 方法,在我的描述示例中,我使用 Mockito 来模拟作为 FirebaseApp 对象的调用的返回跨度>
-
我不确定你模拟 Firebase.initializeApp() 方法是什么意思。虽然 Mockito 非常适合所有目的的模拟,但我想指出还有 Mock Cloud Firestore 可以更接近您对 Firestore 的需求。 Mock Clou Firestore in Flutter documentation
-
我想要的“模拟 Firebase.initializeApp() 方法”非常简单。我想收到一个 FirebaseApp 实例,当单元测试到达 FirebaseFirestore.instanceFor( app: MOCKED_MY_FIREBASEAPP_INSTANCE, ) 时,Mockito 可以很好地模拟该方法,但它返回的对象在 FirebaseFirestore.instanceFor 方法中不起作用我已经检查过CloudFirestore Mock 项目,也许我可以使用它,但为此,我需要对我的代码进行大量重构。我尝试仅使用它来获取 FirebaseApp 实例,但它也对我不起作用。
标签: firebase unit-testing flutter google-cloud-firestore mocking