Я пытаюсь написать модульный тест для этого углового скрипта:
export class DataService {
private csrfToken: string = '';
private isContentShow: BehaviorSubject<boolean> = new BehaviorSubject(true);
constructor(private http: HttpClient, private cookieService: CookieService) {
this.token = this.cookieService.get('token');
}
public createData(data: Data) {
try {
this.http.post( url,
data,
{
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': this.token
})
})
.subscribe(
data => {
this.isContentShow.next(true);
},
err => {
this.showError();
},
() => console.info('Request Complete')
);
return true;
} catch {
this.showError();
}
}
public getIsContentShow(): Observable<boolean> {
return this.isContentShow.asObservable();
}
}
Тест, который у меня был до сих пор, и он работает, как и ожидалось.
it('#getIsContentShow should return value from observable',
(done: DoneFn) => {
service.getIsContentShow().subscribe(value => {
expect(value).toBe(true);
done();
});
});
Однако я пытаюсь написать тест для функции createData()
Я могу издеваться над HttpClient, используя HttpClientTestingModule, но я не знаю, как обращаться с CookieService и токеном?
Спасибо
@dmcgrandle Как вы думаете, должен ли я переместить this.token внутри инструктора, чтобы создать функцию createData ()? Не уверен, какой способ лучше. Спасибо
Я не знаю требований вашего приложения, поэтому не могу ответить, какой способ "лучше". Это может сделать тестирование более простым. Если вы открыты для предложений по переписыванию кода, то я бы посоветовал делать подписку в сервисе не лучшей практикой - попробуйте отправить это в компонент или, что еще лучше, в шаблон.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать шпионов, чтобы следить за методом get cookieService. Таким образом, вы можете написать свой модульный тест для проверки комбинаций возвратов, которые, по вашим словам, может предоставить cookieService.
Эта ссылка говорит, что вы можете подсмотреть прототип метода, чтобы обрабатывать его так, как вам нравится в конструкторе.
it(
"should call #getGeneralStats in the constructor",
inject(
[CookieService, HttpClient],
(cookieService: CookieService, http: HttpClient) => {
let mySpy = spyOn(cookieService, 'get').and.returnValue(<your value>);
dataService = new DataService(http, cookieService);
expect(mySpy).toHaveBeenCalled();
}
)
);
Для вас это может зависеть от того, как вы пишете свои тесты. В примере показано, что служба создается как new ServiceName, но также можно использовать внедрение зависимостей для получения службы. Если вы используете DI для службы, которую тестируете, мне нужно больше узнать, как это сделать (другие, пожалуйста, не стесняйтесь добавлять свой ответ, если вы знаете, как это сделать)!
Вам нужно будет настроить свой макет перед созданием службы для тестирования, поскольку у вас есть вызов cookieService.get() внутри вашего конструктора. Затем, когда служба создастся, она попадет в макет и вернет значение, которое вы установили для установки
token.