1
シンプルなサービス取得メソッドの単体テストで非常に奇妙な問題が発生しています。私はAngular 4とcliを使ってカルマ/ジャスミンをテストしています。ユニットテストでsubscribeメソッドにアクセスできない
マイサービス方法:
getAccounts(): Observable<ApiData> {
return this.authHttp.get('../../assets/mock_data/productsOverview.json')
.map(
data => {
return JSON.parse(data['_body']);
},
err => {
return err;
}
);
}
そして、ここでは、私のテストケースである:
import { TestBed, inject, async } from '@angular/core/testing';
import { Http, BaseRequestOptions, RequestOptions, HttpModule, ConnectionBackend } from '@angular/http';
import { MockBackend, MockConnection } from '@angular/http/testing';
import { AuthHttp, AuthConfig } from 'angular2-jwt';
import { encodeTestToken } from 'angular2-jwt/angular2-jwt-test-helpers';
import { AppModule } from '../app.module';
import { PersonalAccountsService, ApiData } from './personal-accounts.service';
import { Observable } from 'rxjs/Observable';
export function authHttpServiceFactory(http: Http, options: RequestOptions) {
return new AuthHttp(new AuthConfig({
headerName: 'Authorization',
headerPrefix: 'Bearer',
tokenName: 'token',
tokenGetter: (() => localStorage.getItem('token')),
globalHeaders: [
{ 'Content-Type': 'application/json' },
{ 'Ocp-Apim-Subscription-Key': localStorage.getItem('key') }],
}), http, options);
}
const MyMockedService = {
method:() => { }
}
describe('PersonalAccountsService',() => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
PersonalAccountsService,
BaseRequestOptions,
MockBackend,
{
provide: Http,
useFactory: (mockBackend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(mockBackend, defaultOptions);
},
deps: [MockBackend, BaseRequestOptions],
},
{
provide: AuthHttp,
useFactory: (http) => {
return new AuthHttp(new AuthConfig({
tokenName: 'token',
tokenGetter: (() => encodeTestToken(this)),
globalHeaders: [{ 'Content-Type': 'application/json' }]
}), http);
},
deps: [Http],
},
],
imports: [
HttpModule
],
});
});
it('should be created', inject([PersonalAccountsService],
(service: PersonalAccountsService) => {
expect(service).toBeTruthy();
}));
it('identification', async(
inject(
[PersonalAccountsService],
(service: PersonalAccountsService) => {
console.log('ENTERS HERE');
service.getAccounts().subscribe(
data => {
console.log('NOT ENTERING HERE');
},
err => {
console.log('NOT ENTERING HERE');
},
() => {
console.log('NOT ENTERING HERE')
}
);
}
)
));
});
これが起こっているのはなぜ?私は長い間それを理解しようとしており、さらに深く掘り下げてもエラーにはなりません。
はauthHttp何ですか?テストのセットアップとは何ですか? http://stackoverflow.com/help/mcveを提供してください。 – estus
@estus authHttpはトークンを検証するヘルパーです。私がそれを使うかどうかはテスト反応を変えない。私はあなたのために私の質問を更新しました。 –
あなたはMockBackendを使っていますが、実行すべき要求を嘲笑しているわけではありません。単体テストには可動部品が多すぎます。できるだけ孤立した状態にしておくことをお勧めします。テスト。 authHttpを希望の観測値を返すモックで置き換えることを検討してください。 – estus