问题描述
我正在按照此示例进行服务的单元测试(获取来自Spring应用程序后端的请求) https://angular.io/guide/testing#testing-http-services
I'm following this example to make a unit test for service (get request coming from spring app backend) https://angular.io/guide/testing#testing-http-services
服务类别:
@Injectable()
export class TarifService {
constructor(private messageService: MessageService, private http: HttpClient) { }
public getTarifs(): Observable<Tarif[]> {
return this.http.get<Tarif[]>(tarifffsURL).pipe(
tap(() => {}),
catchError(this.handleError('getTarifs', []))
);
}
}
单元测试
describe('TarifService', () => {
let tarifService: TarifService;
let httpClientSpy: { get: jasmine.Spy };
let expectedTarifs;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ToastrModule.forRoot(), HttpClientModule, HttpClientTestingModule],
providers: [TarifService, HttpClient, MessageService]
});
httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']);
tarifService = new TarifService(<any> MessageService,<any> httpClientSpy);
});
it('should be created', inject([TarifService], (service: TarifService) => {
expect(service).toBeTruthy();
}));
it('should return expected tarif (HttpClient called once)', () => {
const expectedTarifs: Tarif[] =
[{ id: 1, name: 'Tarif1', value: '20' }, { id: 2, name: 'Tarif2', value:'30' }];
httpClientSpy.get.and.returnValue(expectedTarifs);
tarifService.getTarifs().subscribe(
tarifs => expect(tarifs).toEqual(expectedTarifs, 'expected tarifs'),
fail
);
expect(httpClientSpy.get.calls.count()).toBe(1, 'one call');
});
});
运行测试时,我一直遇到此错误
When running the tests, I keep having this error
TarifService should return expected tarif (HttpClient called once)
TypeError: this.http.get(...).pipe is not a function
这可能是什么原因?
推荐答案
问题是,当您的spy
被调用时,它返回一个Array
,而Array
没有一个pipe
函数.您需要从spy
返回Observable
,例如
The problem is that when your spy
is being called, it is returning an Array
and Array
does not have a pipe
function. You need to return an Observable
from your spy
, something like this
const expectedTarifs: Tarif[] =
[{ id: 1, name: 'Tarif1', value: '20' }, { id: 2, name: 'Tarif2', value:'30' }];
httpClientSpy.get.and.returnValue(Observable.of(expectedTarifs));
查看returnValue
是Observable.of(expectedTarifs)
的方式. Observable.of
创建一个Observable
,该Observable
会立即发出一个您指定为自变量的值,然后发出一个完整的通知. 请参阅文档
See how the returnValue
is Observable.of(expectedTarifs)
. Observable.of
creates an Observable
that emits some values you specify as arguments, immediately one after the other, and then emits a complete notification. See the docs
希望有帮助
这篇关于Angular单元测试TypeError:this.http.get(...).pipe不是函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!