我正在查看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。
答案 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]);