【问题标题】:How to test class that is using flutter secure storage in flutter如何测试在颤振中使用颤振安全存储的类
【发布时间】:2021-08-17 12:29:06
【问题描述】:

我在我的颤振应用程序中使用“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”函数来检查令牌是否存在。这甚至可能吗?我知道这可能不是单元测试的常用用法。我应该做这种测试吗?

【问题讨论】:

    标签: flutter testing


    【解决方案1】:

    关键部分是将安全存储的依赖注入到 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);
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2019-06-08
      • 2020-12-04
      相关资源
      最近更新 更多