Я пишу юнит-тест для моей трубы. Канал использует пользовательский сервис для запроса данных API. Следуя схеме здесь: https://medium.com/google-developer-experts/angular-2-testing-guide-a485b6cb1ef0 и несколько других источников, которые я собрал:
describe('UserDataPipe', () => {
let pipe;
const userSvcMock = jasmine.createSpyObj('UserService', ['getUser']);
beforeEach(() => TestBed.configureTestingModule({
declarations: [UserDataPipe],
providers: [
{ provide: UserService, useValue: userSvcMock }
]
}));
beforeEach(inject([UserService], p => {
pipe = p;
}));
it('create an instance', () => {
expect(pipe).toBeTruthy();
});
it('should return user display name (firstName lastName)', () => {
console.log(pipe);
});
});
Однако, pipe
не имеет доступа к методу transform
, с которым мне нужно проверить. Он имеет доступ к фактической наблюдаемой, вызываемой в методе transform
, getUser
.
Было предложено использовать этот метод, но это дает тот же результат:
let pipe;
beforeEach(() => {
const userService = jasmine.createSpyObj('UserService', ['getUser']);
pipe = new UserDataPipe(userService);
});
Труба:
@Pipe({
name: 'userData'
})
export class UserDataPipe implements PipeTransform {
constructor(private userService: UserService) {}
transform(value: string, userProp?: any): any {
let userData;
return this.userService.getUser(value).pipe(
map(res => {
userData = res;
if (!userProp) {
return userData;
} else {
const prop = userProp === 'displayName' ? `${userData.firstName} ${userData.lastName}` : res[userProp];
return prop;
}
})
);
}
}