【问题标题】:Is there a way to pass in complex arguments into Mocked Dart Services using Mockito?有没有办法使用 Mockito 将复杂的参数传递给 Mocked Dart 服务?
【发布时间】:2018-05-18 02:38:13
【问题描述】:

我在查看文档:https://pub.dartlang.org/packages/mockito,并试图进一步了解它。似乎在示例中,函数存根正在接受字符串,但对于我将如何实现我的模拟服务有点困惑。

我很好奇我会怎么做。我拥有的服务非常简单直接。

class Group{}
class GroupService {}
class MockGroupService extends Mock implements GroupService {}
final mockProviders = [new Provider(MockGroupService, useExisting: GroupService];

所以你可以看到我正在使用 Angular dart。

我在我的测试文件中创建了一个示例组。

group("service tests", (){
  MockGroupService _mock;
  testBed.addProviders([mockProviders]);

  setUp(() async {
    fixture = await testBed.create();
    _mock = new MockGroupService();

    //This is where I was going to create some stubbs for the methods
    when(_mock.add()).thenReturn((){
      return null; //return the object.
    });

    //create additional when statements for edit, delete, etc.
  });
});

所以我在想的是会有一个参数传递给 add (or 2).... 我将如何在 when 语句中正确编码,以及这 2 个参数如何反映在 then 语句中?

本质上,我想对一个复杂的类进行测试.. 并将其传递给 add。然后它会相应地处理它并返回它。

我是否将类似于以下内容的参数传递给:(使用伪代码)

when(_mock.add(argThat(hasType(Group)))).thenReturn((Group arg)=> arg);

或类似的东西? hasType 不是函数,所以我不能 100% 确定如何处理这个设计。理想情况下,我尝试在测试中创建组,然后相应地将其传递给添加函数。似乎这些示例显示的是字符串。

【问题讨论】:

    标签: unit-testing mocking dart mockito angular-dart


    【解决方案1】:

    是的,mockito 允许传递对象,您可以在 test 中查看示例。

    这有点难以理解,但您可以看到 here 它使用深度相等来检查参数是否相等(如果没有指定匹配器)。

    您问题的第二部分有点复杂。如果您想使用传递到模拟中的值作为响应的一部分,那么您需要使用 thenAnswer。它为您提供刚刚调用的Invocation。您可以从该对象获取和返回方法调用中使用的任何参数。

    因此,对于您的添加示例,如果您知道传入的内容并可以完全访问它,我会写:

    Group a = new Group();
    when(_mock.add(a)).thenReturn(a);
    

    如果 Group 对象是由其他东西创建的,我会写:

    when(_mock.add(argThat(new isInstanceOf<Group>()))
      .thenAnswer((invocation)=>invocation.positionalArguments[0]);
    

    或者,如果您并不真正关心检查类型。根据您用于测试的检查,可能已经为您检查了类型。

    when(_mock.add(any)).thenAnswer(
      (invocation)=>invocation.positionalArguments[0]);
    

    或者如果你使用的是 Dart 2.0:

    when(_mock.add(typed(any))).thenAnswer(
      (invocation)=>invocation.positionalArguments[0]);
    

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2020-04-15
      • 2022-01-03
      相关资源
      最近更新 更多