Testing 如何使用Angular 6和Apollo客户端进行GraphQl测试

Testing 如何使用Angular 6和Apollo客户端进行GraphQl测试,testing,karma-jasmine,angular6,apollo,Testing,Karma Jasmine,Angular6,Apollo,我正在尝试使用Angular 6和GraphQl进行测试开发,但我们真的不知道如何尽可能做到最好。我试图在互联网上找到一些解释这一点的东西,但没有找到真正好的东西 我将在这里发布我的案例,寻找可以帮助我的人,或者可以告诉我任何教程/网站以找到更多好信息的人 问题 我想测试一个身份验证。我有一个auth.service.js和相应的spec.js。您可以在下面看到: 认证服务 从'@angular/core'导入{Injectable}; 从'@ngrx/Store'导入{Store}; 从“/

我正在尝试使用Angular 6和GraphQl进行测试开发,但我们真的不知道如何尽可能做到最好。我试图在互联网上找到一些解释这一点的东西,但没有找到真正好的东西

我将在这里发布我的案例,寻找可以帮助我的人,或者可以告诉我任何教程/网站以找到更多好信息的人

问题

我想测试一个身份验证。我有一个auth.service.js和相应的spec.js。您可以在下面看到:

认证服务

从'@angular/core'导入{Injectable};
从'@ngrx/Store'导入{Store};
从“/../../store/user/actions”导入*作为用户操作;
从“graphql标签”导入gql;
从“Apollo angular”导入{Apollo};
从'@angular/Router'导入{Router};
@注射的({
providedIn:'根'
})
导出类身份验证服务{
用户;
构造函数(私有存储:存储,私有阿波罗:阿波罗,私有路由器:路由器){
this.store.select('state').subscribe(state=>this.user=state);
}
/**
*检查电子邮件和登录密码的功能
*@param电子邮件
*@param密码
*/
登录(电子邮件:字符串,密码:字符串){
这个,阿波罗,变异({
突变:this.loginRequestGql(),
变量:{
电邮:电邮,,
密码:密码
}
}).subscribe(值=>{
const data=value.data.login;
这个.saveUserData(数据);
this.router.navigate(['/app']);
});
}
/**
*将用户数据保存在存储和会话存储中的函数
*@param数据
*/
saveUserData(数据){
dispatch(newuseractions.Login({token:data.token}));
this.setSessionStorage(this.user);
}
/**
*删除存储中的用户信息的函数
*/
注销(){
this.store.dispatch(new UserActions.Logout());
this.setSessionStorage(this.user);
}
/**
*使用Graphql sintax创建请求的函数
*/
loginRequestGql(){
返回gql`
变异登录($email:String!,$password:String!){
登录(电子邮件:$email,密码:$password){
代币
}
}
`;
}
/**
*将数据参数保存在会话存储器中的函数
*@param数据
*/
设置会话存储(数据){
setItem('session',JSON.stringify(data));
}

}
在阿波罗angular的最新版本中,我们发布了一个测试实用程序。测试技术与您在Angular中测试HttpClient的方式非常相似

要了解有关如何测试使用Apollo的组件和服务的更多信息,请阅读有关Apollo的官方文档


在执行变异时,我们似乎无法将
expectOne
与简单的
DocumentNode
参数一起使用。 因此,不是:

backend.expectOne(authService.loginRequestGql).flush(TEST_RESPONSE);
我们必须向
expectOne
传递一个函数,该函数断言操作的查询定义是预期的:

backend.expectOne((operation) => {
    expect(operation.query.definitions).toEqual(mutation.definitions);
    return true;
})
.flush(TEST_RESPONSE);

我们找不到关于变异请求的有用测试。也许,我的错误是关于概念的,我不能直接创建变异测试。@Diegagalocha没有变异测试的示例,但您可以按照操作名称和文档,与查询完全相同地对其进行测试。