有没有办法使用Mockito将复杂的参数传递给Mocked Dart Services?

时间:2017-12-04 15:24:36

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

我正在查看https://pub.dartlang.org/packages/mockito上的文档,并试图更多地了解它。似乎在示例中,函数存根接受字符串,但是对于我将如何实现我的Mocked服务感到困惑。

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

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(或2)....我将如何在when语句中正确编码,以及这两个参数如何反映在then语句中? / p>

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

我是否会将参数传递给类似于:(使用伪代码)

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

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

1 个答案:

答案 0 :(得分: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]);