Javascript Angular2服务的Karma/Jasmine测试用例

Javascript Angular2服务的Karma/Jasmine测试用例,javascript,angular,unit-testing,typescript,karma-jasmine,Javascript,Angular,Unit Testing,Typescript,Karma Jasmine,api-connector.service.ts 从“@angular/core”导入{Injectable}; 从'@angular/common/http'导入{HttpClient,HttpParams}; 从“rxjs/observable/ErrorObservable”导入{ErrorObservable}; 从“rxjs/Observable”导入{Observable}; 从“../../../environments/environment”导入{environment}; 从

api-connector.service.ts
从“@angular/core”导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpParams};
从“rxjs/observable/ErrorObservable”导入{ErrorObservable};
从“rxjs/Observable”导入{Observable};
从“../../../environments/environment”导入{environment};
从'rxjs/operators/catchError'导入{catchError};
@可注射()
导出类ApiConnectorService{
构造函数(私有http:HttpClient){}
私有getQueryString(参数):字符串{
const queryString=Object.keys(params).map(key=>key+'='+params[key]).join('&');
log('queryString',queryString);
返回(“?”+查询字符串);
}
私有格式错误(错误:任意){
返回新的ErrorObservable(error.error);
}
get(路径:string,负载:Object={}):可观察{
返回this.http.get(`${environment.base_url}${path}`+this.getQueryString(有效负载))
.pipe(catchError(this.formatErrors));
}
put(路径:string,主体:Object={}):可观察{
返回this.http.put(
`${environment.base_url}${path}`,
身体
).pipe(catchError(this.formatErrors));
}
post(路径:字符串,正文:对象):可观察{
//console.log('API服务主体',主体)
返回this.http.post(
`${environment.base_url}${path}`,
身体
).pipe(catchError(this.formatErrors));
}
删除(路径):可观察{
返回this.http.delete(
`${environment.base_url}${path}`
).pipe(catchError(this.formatErrors));
}

}
仔细考虑后,我将以这种方式测试您的服务。我不能为上一次测试提供确切的细节,因为我没有关于ApiConnectorService或LoginResponse对象的详细信息,但我相信您会明白的

import { TestBed, inject } from '@angular/core/testing';

import { LoginService } from './login.service';
import { LoginResponse, LoginRequest } from './login.contract';
import { Observable, of } from 'rxjs';
import { ApiConnectorService } from './api-connector.service';

class ApiConnectorServiceStub {

  constructor() { }

  post(address: string, payload: LoginRequest): Observable<LoginResponse> {
    return  of(new LoginResponse());
  }
}

describe('LoginService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [LoginService,
        {provide: ApiConnectorService, useClass: ApiConnectorServiceStub }]
    });
  });

  it('should be created', inject([LoginService], (service: LoginService) => {
    expect(service).toBeTruthy();
  }));

  it('should call post on apiConnectorService with right parameters when login is called',
                                          inject([LoginService], (service: LoginService) => {
    const apiConnectorStub = TestBed.get(ApiConnectorService);
    const spy = spyOn(apiConnectorStub, 'post').and.returnValue(of(new LoginResponse()));

    const loginRequest = of(new LoginRequest());
    service.login(loginRequest);

    expect(spy).toHaveBeenCalledWith('/api/login', loginRequest);
  }));

  it('should map data correctly when login is called', inject([LoginService], (service: LoginService) => {
    const apiConnectorStub = TestBed.get(ApiConnectorService);

    // Set you apiConnector output data here
    const apiData = of('Test Data');
    const spy = spyOn(apiConnectorStub, 'post').and.returnValue(apiData);

    const result = service.login(of(new LoginRequest()));
    // Set your expected LoginResponse here.
    const expextedResult = of(new LoginResponse());

    expect(result).toEqual(expextedResult);
  }));
});
从'@angular/core/testing'导入{TestBed,inject};
从“./login.service”导入{LoginService};
从“/login.contract”导入{LoginResponse,LoginRequest};
从'rxjs'导入{可观察的};
从“./api connector.service”导入{ApiConnectorService};
类ApiConnectorServiceStub{
构造函数(){}
post(地址:字符串,有效负载:LoginRequest):可观察{
返回(新登录回复());
}
}
描述('LoginService',()=>{
在每个之前(()=>{
TestBed.configureTestingModule({
提供者:[登录服务,
{提供:ApiConnectorService,useClass:ApiConnectorServiceStub}]
});
});
它('should be created',inject([LoginService],(service:LoginService)=>{
expect(service.toBeTruthy();
}));
它('在调用登录名时,应使用正确的参数调用apiConnectorService上的post',
注入([LoginService],(服务:LoginService)=>{
const apiconnectorsub=TestBed.get(ApiConnectorService);
const spy=spyOn(apiconnectorsub,'post')。和.returnValue(of(new LoginResponse());
const loginRequest=of(new loginRequest());
service.login(loginRequest);
expect(spy).toHaveBeenCalledWith('/api/login',loginRequest);
}));
它('调用登录时应正确映射数据',注入([LoginService],(服务:LoginService)=>{
const apiconnectorsub=TestBed.get(ApiConnectorService);
//在此处设置apiConnector输出数据
常数apiData=of(“测试数据”);
const spy=spyOn(apiconnectorsub,'post')。和.returnValue(apiData);
const result=service.login(属于(new LoginRequest());
//在此处设置您的预期登录响应。
const expxtedresult=of(new LoginResponse());
期望(结果)。toEqual(expextedResult);
}));
});

如果您使用的是Angular 5或6,本指南可能会有所帮助:@lain谢谢您提供的信息,这给了我一个简短的想法,但为了更好地理解,我需要做一些练习。如果可能,请探索更多,我现在添加了依赖项。