如何在 flutter 中模拟数据库
How to mock database in flutter
我尝试模拟数据库来测试我的本地 api,我在官方文档中搜索找到可以与远程 api 一起工作的 mockito,但也不能与开箱即用的本地数据库一起工作, 有什么办法解决这个问题吗?
在这些情况下,您有两种选择(还有许多其他选择)。即使我的示例假设您正在进行 HTTP 调用,也没关系。无论我公开的具体用例如何,您都可以使用这些策略!
第一个是使用“策略模式”为 API 创建接口,然后在测试和生产 API 之间切换。这是一个简单的例子:
abstract class HttpRepository {
const HttpRepository();
Future<Something> sendRequest();
}
您现在可以创建 2 个具体的 classes:一个用于实际 API 调用,另一个只是用于测试的模拟。
/// Use this in your tests
class MockHttpRepository extends HttpRepository {
const MockHttpRepository();
@override
Future<Something> sendRequest() async {
// Simulating the HTTP call
await Future.delayed(const Duration(seconds: 2));
return Something();
}
}
/// Use this in your Flutter code to make the actual HTTP call or whatever else
class ApiHttpRepository extends HttpRepository {
const ApiHttpRepository();
@override
Future<Something> sendRequest() async {
// Doing a real HTTP call
final response = await makeGetOrPost();
return Something.withData(response);
}
}
这样,您将在 Flutter 应用中使用 ApiHttpRepository
,在测试中使用 MockHttpRepository
。尽可能使用 const
构造函数。
另一种方法是使用模拟来模拟虚假的 HTTP 调用或其他任何东西。基本上,您使用 when
来“捕获”方法调用和 return 您可以控制的假响应。
// 1. "Enable" mocking on your type
class MockRepo extends Mock implements ApiHttpRepository {}
// 2. Mock methods
const ApiHttpRepository repo = MockRepo();
when(repo.sendRequest()).thenAnswer((_) async => Something());
在这种情况下,我们使用 thenAnswer
,因为 sendRequest()
的 return 类型是 Future<T>
类型。在您的情况下,如果您正在从数据库中读取数据,您只需要:
- 使用
extends Mock implements YourClass
让你的 class “可模仿”
- 在模拟实例上使用
when
并控制输出
如果方法 return 是 Future<T>
并且在所有其他情况下 thenReturn
,请确保使用 thenAnswer
。
我尝试模拟数据库来测试我的本地 api,我在官方文档中搜索找到可以与远程 api 一起工作的 mockito,但也不能与开箱即用的本地数据库一起工作, 有什么办法解决这个问题吗?
在这些情况下,您有两种选择(还有许多其他选择)。即使我的示例假设您正在进行 HTTP 调用,也没关系。无论我公开的具体用例如何,您都可以使用这些策略!
第一个是使用“策略模式”为 API 创建接口,然后在测试和生产 API 之间切换。这是一个简单的例子:
abstract class HttpRepository {
const HttpRepository();
Future<Something> sendRequest();
}
您现在可以创建 2 个具体的 classes:一个用于实际 API 调用,另一个只是用于测试的模拟。
/// Use this in your tests
class MockHttpRepository extends HttpRepository {
const MockHttpRepository();
@override
Future<Something> sendRequest() async {
// Simulating the HTTP call
await Future.delayed(const Duration(seconds: 2));
return Something();
}
}
/// Use this in your Flutter code to make the actual HTTP call or whatever else
class ApiHttpRepository extends HttpRepository {
const ApiHttpRepository();
@override
Future<Something> sendRequest() async {
// Doing a real HTTP call
final response = await makeGetOrPost();
return Something.withData(response);
}
}
这样,您将在 Flutter 应用中使用 ApiHttpRepository
,在测试中使用 MockHttpRepository
。尽可能使用 const
构造函数。
另一种方法是使用模拟来模拟虚假的 HTTP 调用或其他任何东西。基本上,您使用 when
来“捕获”方法调用和 return 您可以控制的假响应。
// 1. "Enable" mocking on your type
class MockRepo extends Mock implements ApiHttpRepository {}
// 2. Mock methods
const ApiHttpRepository repo = MockRepo();
when(repo.sendRequest()).thenAnswer((_) async => Something());
在这种情况下,我们使用 thenAnswer
,因为 sendRequest()
的 return 类型是 Future<T>
类型。在您的情况下,如果您正在从数据库中读取数据,您只需要:
- 使用
extends Mock implements YourClass
让你的 class “可模仿”
- 在模拟实例上使用
when
并控制输出
如果方法 return 是 Future<T>
并且在所有其他情况下 thenReturn
,请确保使用 thenAnswer
。