我正在開發一個舊的 Angular 應用程式并嘗試對這些功能按預期作業進行單元測驗。
我只是想測驗一個函式是否回傳正確的 http 請求,但測驗無法讀取 observable。
import {HttpClient} from '@angular/common/http';
@Injectable()
export class MyService {
constructor(private http: HttpClient) {}
getUrl() {
//lots of logic to determine which url to get
return this.http.put(url, null, { headers: requestHeaders, withCredentials: true
}).pipe(
map((response: any) => {
return response;
}));
}
}
有沒有辦法測驗這個 getUrl 函式的結果?
如果我只是簡單地記錄這個函式的結果,我會得到一個 observable。
Observable{_isScalar: false, source: Observable{_isScalar: false, source: Observable{_isScalar: ..., source: ..., operator: ...}, operator: MapOperator{project: ..., thisArg: ...}}, operator: CatchOperator{selector: handleError(error) { ... }, caught: Observable{_isScalar: ..., source: ..., operator: ...}}}
如果我訂閱這個 observable,什么都不會發生。
let test = null;
service.getUrl().subscribe((value) => {
test = value
});
console.log('test result', test);
這將記錄為空。
對于如何獲得此功能的結果,我將不勝感激。謝謝
uj5u.com熱心網友回復:
在 Angular 中有幾種方法可以對服務進行單元測驗。你可以在這里閱讀:測驗 HTTP 服務
另一種方法是在您的*.spec.ts檔案中創建一個模擬服務。
const MOCK_GET_URL_RESPONSE = 'test';
export class MockService() {
// Implement service functions here
getUrl(): Observable<any> {
return of(MOCK_GET_URL_RESPONSE);
}
}
describe('ABCComponent', () => {
let component: ABCComponent;
let fixture: ComponentFixture<ABCComponent>;
let service: MockService;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ABCComponent],
imports: [CommonModule, HttpClientTestingModule],
// Provide your service and indicate which
// class is to be used to mock it
providers: [{ provide: MyService, useClass: MockService }],
}).compileComponents();
});
it('should create', () => {
service.getUrl().subscribe((res) => {
console.log(res); // test
expect(res).not.toBeNull(); // true
});
});
});
如果您選擇使用模擬服務進行測驗,通常情況下,最好定義回應的資料型別。因此,將您的 API 回應映射到型別而不是any.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436663.html
上一篇:無法從另一個專案訪問變數
