簡體   English   中英

如何測試在 flutter 中使用 flutter 安全存儲的 class

[英]How to test class that is using flutter secure storage in flutter

我在我的 flutter 應用程序中使用“flutter_secure_storage”package 來存儲 REST ZDB974238714CA3ACEDE408AZF 的令牌。 我的身份驗證 class 如下所示:

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;
  }
}

我想測試這個 class。 我知道 flutter 中的 Mock 和 mockito package。 但我不知道如何為 FlutterSecureStorage class 創建模擬。

例如,我如何調用“logIn”function 來存儲令牌,然后調用“isLoggedIn”function 來檢查令牌是否存在。 這甚至可能嗎? 我知道這可能不是單元測試的常用用法。 我什至應該做這種測試嗎?

關鍵部分是將安全存儲的依賴注入到 Auth 中,而不是將其聲明為 class 變量。 否則你不能嘲笑它。

我將通過創建一個使用安全存儲的接口來進一步解決它,並將接口作為變量傳遞給 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 class 不直接依賴於 FlutterSecureStorage,您可以輕松地模擬 IStorage 並確保在 Auth 中一切正常。

然后您的測試可以執行以下操作:

class MockStorage extends Mock implements IStorage {}
final mockStorage = MockStorage();
final auth = Auth(mockStorage);
...
verify(() => mockStorage.saveToken()).called(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM