我正在尝试测试使用FirebaseFirestore的方法,但无法模拟FirebaseFirestore.instance属性。
我正在关注以下示例:
我正在为我的课程使用下面的代码,它运行良好,这意味着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);
});
});
});
}
答案 0 :(得分:2)
也许 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());
}
答案 1 :(得分:0)
想将FutureBuilder用作树的根小部件或根小部件,扑动总是需要一个MaterialApp或其他(现在不要记住)。
建议,重构FutureBuilder->包装丝毫小部件-> MaterialApp(home:FutureBuilder(...
并检查MyWidget()第一个小部件,可能是相同的MaterialApp出错,但不确定。
如果您使用路由方法进行导航,请使用initialRoute。
好运!
答案 2 :(得分:0)
我有同样的问题。使用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
});
}