目前,我正在为我的移动网络应用程序(Android应用程序)编写单元测试。单元测试是指我基于Google Firebase Auth构建的登录系统。
使用firebase authentication
插件的最新版本之一,某些函数的返回类型已更改。例如,方法firebaseAuth.signInWithEmailAndPassword
已从FirebaseUser
更改为AuthResult
我在AuthService.dart
中有一个登录函数,其内容如下:
Future<bool> login(LoginUserData userData) async {
try {
_checkUserDataValidity(userData);
final AuthResult authResult= await firebaseAuth.signInWithEmailAndPassword(email: userData.email, password: userData.password);
return authResult.user != null;
} catch (exception) {
return false;
}
}
因此,正如您所看到的,我仅检查用户数据是否正确-我将返回一个 bool(boolean) 值以在另一个文件中对此进行检查(如果返回true,则
Navigator
路由到另一个站点,如果返回错误,则返回错误消息弹出)。我的单元测试例如检查以下几种情况:
测试的示例代码:
test('Login should work with valid user data', () async {
when(
firebaseAuthMock.signInWithEmailAndPassword(
email: testValidUserData.email,
password: testValidUserData.password,
)
).thenAnswer(
(_) => Future<AuthResultMock>.value(firebaseAuthResultMock)
);
final bool actionSuccess = await authService.login(testValidUserData);
verify(
firebaseAuthMock.signInWithEmailAndPassword(
email: testValidUserData.email,
password: testValidUserData.password,
)
).called(1);
expect(actionSuccess, true);
});
为了涵盖上面列出的案例一和案例二,我想使用两个不同的Mocks。一个Mock包含一个用户,另一个Mock中没有用户。
当前的问题:
(_) => Future<AuthResultMock>.value(firebaseAuthResultMock)
在我的测试中与
AuthServie.dart
中的此代码冲突return authResult.user != null;
模拟用户为null。我该如何更改? :) Bt.w我正在使用Mockito。
我的想法是:
非常感谢。 :)
最佳答案
我是最近在寻找答案,却偶然发现了您的问题。但与此同时,我找到了解决方案。希望这对您有用。
我发现有一堆用于模拟Firebase的flutter软件包,用于Firebase Auth的一个软件包是:https://pub.dev/packages/firebase_auth_mocks。
另外,如果您不想将更多软件包导入代码,则可以创建一个更简单的版本。像这样:
class MockFirebaseAuth extends Mock implements FirebaseAuth {}
class MockAuthResult extends Mock implements AuthResult {
FirebaseUser user = MockFirebaseUser();
}
class MockFirebaseUser extends Mock implements FirebaseUser {
@override
String get displayName => 'Test Name';
@override
String get uid => 'abc1234';
}
关于android - Flutter UnitTest:同一类的两个不同的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59555349/