mockito 为什么莫奇托镖没有间谍功能?

bmp9r5qi  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(103)

下面的代码是我的代码的一个简化示例。我有一个依赖于类B的类A。我想测试类A,所以我模拟了类B。然后我为类A的一个方法编写了一个测试,在这个测试中,我为我模拟的类B中的一个方法被调用时编写了一个存根:

fetchData() async {
try {
  await b.getData();
}  on DioError catch (e) {
  switch (e.response!.statusCode) {
    case 401:
      logout();
      throw UnauthorizedException();
    default:
      throw UnspecifiedDioException(error: e);
  }
}

为fetchData()方法编写的测试:

test('check if fetchData calls logout when 401 is returned', () {

     when(mockB.getData())
         .thenAnswer((_) async =>
         throw DioError(
             requestOptions: RequestOptions(path: ""),
             response: Response(requestOptions: RequestOptions(path: ""), statusCode: 401)));

     verify(a.logout()); // doesn't work because A isn't mocked
});

我读到过你可以很容易地用spies来做这个,但是让我惊讶的是spies可以用在除了dart之外的每一种使用mockito的语言中。它显然是被弃用的,但是如果没有一个更新的版本来替换它,怎么能被弃用呢?
如果有人能告诉我是否有一个方便的解决方案来实现我正在努力实现的目标,我将非常感激。
编辑:我换了一个问题,因为前一个问题没有多大意义。我只是想知道在飞镖中是否有间谍之类的东西。

8ehkhllq

8ehkhllq1#

  • 使用mocktail ..* 您还应该存根您的logout调用的依赖关系。
class A {
  A({required this.api, required this.auth});

  // to be mocked
  final Api api;
  final Auth auth;

  Future<void> fetchData() async {
    try {
      await api.getData();
    } catch (e) {
      auth.logout();
    }
  }
}

class Auth {
  Future<void> logout() => Future(() {});
}

class Api {
  Future<void> getData() => Future(() {});
}

你的测试

class MockApi extends Mock implements Api {}

class MockAuth extends Mock implements Auth {}

void main() {
  // create mock objects
  final mockApi = MockApi();
  final mockAuth = MockAuth();

  test('when [Api.getData] throws, [Auth.logout] is called', () async {
    // create an instance of "A" and use your mock objects
    final a = A(api: mockApi, auth: mockAuth);

    // use "thenThrow" to throw
    when(() => mockApi.getData()).thenThrow('anything');
    // use "thenAnswer" for future-returning methods
    when(() => mockAuth.logout()).thenAnswer((_) => Future.value(null));

    // call the method to "start" the test
    await a.fetchData();

    // verify logout was called
    verify(mockAuth.logout).called(1); // passes
  });
}

相关问题