Модульное тестирование с Angular 7

Я пытаюсь написать модульный тест для этого углового скрипта:

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 и токеном?

Спасибо

Вам нужно будет настроить свой макет перед созданием службы для тестирования, поскольку у вас есть вызов cookieService.get() внутри вашего конструктора. Затем, когда служба создастся, она попадет в макет и вернет значение, которое вы установили для установки token.

dmcgrandle 14.02.2019 03:01

@dmcgrandle Как вы думаете, должен ли я переместить this.token внутри инструктора, чтобы создать функцию createData ()? Не уверен, какой способ лучше. Спасибо

daniel8x 14.02.2019 17:24

Я не знаю требований вашего приложения, поэтому не могу ответить, какой способ "лучше". Это может сделать тестирование более простым. Если вы открыты для предложений по переписыванию кода, то я бы посоветовал делать подписку в сервисе не лучшей практикой - попробуйте отправить это в компонент или, что еще лучше, в шаблон.

dmcgrandle 14.02.2019 17:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
108
1

Ответы 1

Вы можете использовать шпионов, чтобы следить за методом 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 для службы, которую тестируете, мне нужно больше узнать, как это сделать (другие, пожалуйста, не стесняйтесь добавлять свой ответ, если вы знаете, как это сделать)!

Другие вопросы по теме