【发布时间】:2023-01-30 09:20:00
【问题描述】:
我正在尝试测试使用 FirebaseAuth 登录的整个 AuthManager 类。这是我的文件:
class AuthManager extends ChangeNotifier {
final FirebaseAuth auth;
Stream<User?> get user => auth.authStateChanges();
static Future<FirebaseApp> initializeFirebase({
required BuildContext context,
}) async {
FirebaseApp firebaseApp = await Firebase.initializeApp();
return firebaseApp;
}
AuthManager({required this.auth});
Future<String> signup(String email, String password) async {
try {
final credential = await auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
return "Success";
} on FirebaseAuthException catch (e) {
rethrow;
}
}
Future<String> signInWithEmailAndPassword(
String email, String password) async {
try {
final userCredential = await auth.signInWithEmailAndPassword(
email: email, password: password);
return "Success";
} on FirebaseAuthException catch (e) {
return "Failed";
} catch (e) {
rethrow;
}
}
static Future<String> signOut() async {
try {
await FirebaseAuth.instance.signOut();
return "Success";
} catch (e) {
rethrow;
}
}
}
我曾经返回 usercredential 但想尝试测试一个简单的字符串返回测试,遵循本教程:https://www.youtube.com/watch?v=4d6hEaUVvuU,这是我的测试文件
import 'package:firebase_auth/firebase_auth.dart';
import 'package:notes_firebase_app/data/models/auth_manager.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
class MockFirebaseAuth extends Mock implements FirebaseAuth {
@override
Stream<User> authStateChanges() {
return Stream.fromIterable([
_mockUser,
]);
}
}
class MockUser extends Mock implements User {}
final MockUser _mockUser = MockUser();
class MockUserCredential extends Mock implements Future<UserCredential> {}
void main() {
final MockFirebaseAuth mockFirebaseAuth = MockFirebaseAuth();
final AuthManager authManager = AuthManager(auth: mockFirebaseAuth);
final MockUserCredential mockUserCredential = MockUserCredential();
setUp(() {});
test("emit occurs", () async {
expectLater(authManager.user, emitsInOrder([_mockUser]));
});
test("create account", () async {
when(mockFirebaseAuth.createUserWithEmailAndPassword(
email: "tadas@gmail.com", password: "123456"))
.thenAnswer((realInvocation) => null);
expect(
await authManager.signInWithEmailAndPassword(
"tadas@gmail.com", "123456"),
"Success");
});
}
我在这里面临两个问题,不能传递 null 因为我们现在需要处理它或者抛出这个错误
The return type 'Null' isn't a 'Future<UserCredential>', as required by the closure's context
然后我试着像这样模拟 UserCredential。
final MockUserCredential mockUserCredential = MockUserCredential();
when(mockFirebaseAuth.createUserWithEmailAndPassword(
email: "tadas@gmail.com", password: "123456"))
.thenAnswer((realInvocation) => mockUserCredential);
但我收到此错误:
type 'Null' is not a subtype of type 'Future<UserCredential>'
我究竟做错了什么 ?帮助将不胜感激。
【问题讨论】:
-
你好,你解决了吗?
-
用最新的包试试这个answer
标签: flutter unit-testing firebase-authentication mockito