如何使用 Apollo Angular 测试查询、变异、订阅服务?
Posted
技术标签:
【中文标题】如何使用 Apollo Angular 测试查询、变异、订阅服务?【英文标题】:How cant test Query, Mutation, Subscription services using Apollo Angular? 【发布时间】:2020-08-31 20:34:57 【问题描述】:我看到了testing apollo in angular 工作原理的示例,基本上只使用ApolloTestingModule 进行测试。我的测试看起来像:
测试服
describe('CountriesService', () =>
let countryService: CountriesService;
let controller: ApolloTestingController;
let scheduler: TestScheduler;
let countries: any;
beforeAll(() =>
TestBed.configureTestingModule(
imports: [ApolloTestingModule],
);
countries = [ code: 'C1', phone: '500', name: 'Country' ];
scheduler = new TestScheduler((actual, expected) =>
expect(actual).toEqual(expected);
);
countryService = TestBed.inject(CountriesService);
controller = TestBed.inject(ApolloTestingController);
);
test('should be created', () =>
expect(countryService).toBeTruthy();
);
test('should return an array of countries', () =>
countryService.watch().valueChanges.subscribe(console.log);
const operation = controller.expectOne(COUNTRIES_GQL);
operation.flush( data: countries );
controller.verify();
);
);
服务
@Injectable( providedIn: 'root' )
export class CountriesService
constructor(private apollo: Apollo)
watch()
return this.apollo.watchQuery(
query: COUNTRIES_GQL,
);
问题
我想使用 Query, Mutation, Subscription service 的方法,但是用这种方法测试不起作用。
@Injectable( providedIn: 'root' )
export class CountriesService extends Query<any>
document = COUNTRIES_GQL;
错误
● CountriesService › should return an array of countries
TypeError: Cannot read property 'use' of undefined
30 |
31 | test('should return an array of countries', () =>
32 | countryService.watch().valueChanges.subscribe(console.log);
| ^
33 |
34 | const operation = controller.expectOne(COUNTRIES_GQL);
35 | operation.flush( data: countries );
对我来说,这个错误是有道理的,因为在 Query class 的官方实现中,方法 fetch 和 watch 使用的是 Apollo 服务提供的 use 方法。
问题
是否有替代方法来测试 apollo 提供的此类服务? 如果我想使用这种方法,我应该将其作为基本服务进行测试?等待你的回答
【问题讨论】:
【参考方案1】:尝试实例化你的服务
并使用methode countryService.watch()
调用它
那么
countryService.watch().valueChanges.subscribe(console.log);
【讨论】:
我不明白,因为那行代码和我在测试服里的一样【参考方案2】:我能够使用这种在提供程序中模拟服务的方法使其工作(不使用 AppolloTestingModule)。制作了一个辅助函数graphQlServiceMock
,以便在所有服务中重用。
TestBed.configureTestingModule(
...
providers: [
provide: MyGQLService,
useValue: graphQlServiceMock( users: null ),
,
]
)
export const graphQlServiceMock = (response: any) => (
watch: () => (
valueChanges: of(
data:
...response,
,
loading: false,
),
),
);
或者没有助手..
TestBed.configureTestingModule(
...
providers: [
provide: MyGQLService,
useValue:
watch: () => (
valueChanges: of(
data:
users: null,
,
loading: false,
),
),
,
,
];
)
【讨论】:
抱歉,我看到了watch
,并认为您使用的是较新的生成服务方法 (apollo-angular.com/docs/data/services),否则我的代码可能不适用于您 :)以上是关于如何使用 Apollo Angular 测试查询、变异、订阅服务?的主要内容,如果未能解决你的问题,请参考以下文章
Angular 使用 Apollo:单元测试:错误:尚未定义客户端
在 Jasmine/Karma 测试中使用 mockError 时,apollo-angular 会抛出错误
Apollo Client Angular:如何将从查询中获得的数据作为参数传递给graphql中的另一个查询?
使用 apollo 在 Angular 中捕获 http 状态代码