flutter - 如何在flutter中测试使用flutter安全存储的类
问题描述
我在我的颤振应用程序中使用“flutter_secure_storage”包来存储 REST API 的令牌。我的身份验证类如下:
import 'dart:convert';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'package:tutor_finder_frontend/constants/api_path.dart' as APIConstants;
class Auth {
final _storage = FlutterSecureStorage();
var headers = {'Content-Type': 'application/json'};
Future<bool> isLoggedIn() async {
final isLoggedIn = await _storage.containsKey(key: 'token');
return isLoggedIn;
}
logOut() async {
await _storage.delete(key: 'token');
}
Future<bool> createAccount(String email, String password) async {
var body = jsonEncode({'email': email, 'password': password});
var response = await http.post(Uri.parse(APIConstants.CREATE_USER_URL),
headers: headers, body: body);
if (response.statusCode == 201) {
var jsonResponse = jsonDecode(response.body);
var token = jsonResponse['token'];
await _storage.write(key: 'token', value: token);
return true;
}
return false;
}
Future<bool> logIn(String email, String password) async {
var body = jsonEncode({'username': email, 'password': password});
var response = await http.post(Uri.parse(APIConstants.LOGIN_USER_URL),
headers: headers, body: body);
if (response.statusCode == 200) {
var jsonResponse = jsonDecode(response.body);
var token = jsonResponse['token'];
await _storage.write(key: 'token', value: token);
return true;
}
return false;
}
}
我想测试这门课。我知道 Flutter 中的 Mock 和 mockito 包。但我不知道如何为 FlutterSecureStorage 类创建模拟。
例如,我如何调用“logIn”函数来存储令牌,然后调用“isLoggedIn”函数来检查令牌是否存在。这甚至可能吗?我知道这可能不是单元测试的常用用法。我什至应该做这种测试吗?
解决方案
关键部分是将安全存储的依赖注入到 Auth 中,而不是将其声明为类变量。否则你不能嘲笑它。
我将通过创建一个使用安全存储的接口来进一步解决它,并将接口作为变量传递给 Auth。这样,如果需要,很容易模拟(也可以替换)该插件。抽象掉插件特定的依赖关系通常是非常好的。
测试您的登录方法是一件好事。但请记住,您应该对您的代码进行单元测试,而不是确保 SecureStorage 正确地完成了它的工作。该责任在于 SecureStorage 写入方法的单元测试。您的单元测试应该确保安全存储的 write 方法(或者更确切地说是接口 saveToken 方法)被调用一次。
所以是这样的:
class Auth {
Auth(this._storage);
final IStorage _storage;
...
}
abstract class IStorage {
Future<void> saveToken(String token);
}
class MyStorage implements IStorage {
MyStorage(this._storage);
final FlutterSecureStorage _storage;
@override
Future<void> saveToken(String token) => _storage.write(key: 'token', value: token);
}
这样您的 Auth 类就不会直接依赖于 FlutterSecureStorage,您可以轻松地模拟 IStorage 并确保在 Auth 中一切正常。
然后您的测试可以执行以下操作:
class MockStorage extends Mock implements IStorage {}
final mockStorage = MockStorage();
final auth = Auth(mockStorage);
...
verify(() => mockStorage.saveToken()).called(1);
推荐阅读
- css - 为光标添加颜色: url("data:image)
- html - 为什么 flex-shrink 在我的示例中表现得这样?
- regex - 如何使用正则表达式查找和反转文件名的前两个单词,其中单词由 . 或空格
- javascript - 导航栏不会在滚动时隐藏
- java - p:calendar 使用 1930-2029 和 MM/dd/yy 日期格式
- python - 模拟静态方法调用的模块函数不起作用
- android - 来自 JSON 数据的 Android 动态查看器和 tablayout
- reactjs - React Navigation v3 与 React Native Navigation v2
- python-3.x - 基于多索引级别在 DataFrame 上运行函数并将其附加到新列
- c++ - 在其一侧显示 glutSolidCone