我在我的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类创建mock。
例如,我如何调用“logIn”函数来存储令牌,然后调用“isLoggedIn”函数来检查令牌是否存在。这可能吗?我知道这可能不是单元测试的通常用途。我应该做这种测试吗?
2条答案
按热度按时间z9gpfhce1#
关键部分是将安全存储的依赖注入到Auth中,而不是将其声明为类变量。否则无法模拟它。
我将通过创建一个接口来进一步解决这个问题,通过这个接口我可以使用安全存储,并将接口作为变量传递给Auth。这样,如果需要的话,很容易模拟(也可以替换)该插件。抽象出插件特定的依赖关系通常是非常好的。
测试你的登录方法是一件好事。但是请记住,你应该对你的代码进行单元测试,而不是确保SecureStorage正确地完成了它的工作。这个责任在SecureStorage写方法的单元测试上。你的单元测试应该确保安全存储的写方法(或者更确切地说是接口saveToken方法)被调用一次。
比如说
这样,您的Auth类就不会直接依赖于FlutterSecureStorage,您可以轻松地模拟IStorage并确保Auth中一切正常。
你的测试可以这样做:
sqxo8psd2#
在任何情况下,您直接访问Flutter安全存储,您可能能够模拟通道。