Угловой 6 блок тестирования статического отклика - PullRequest
0 голосов
/ 28 февраля 2019

Я тестирую Angular-компонент, который вызывает сервисный метод.Внутри компонента я изменяю некоторые поля ответа перед продолжением, например:

ngOnInit() {
    this.myService.myMethod(requestData).subscribe(response => {
      response.list.forEach(item => {
        item.someField = someValue;
      })
    });
    ...
}

Для тестирования я создал ложный ответ, подобный следующему:

const mockServiceResponse = {
    list: [],
    ...
}

const myServiceSpy = jasmine.createSpyObj('MyService',['myMethod']);
myServiceSpy .myMethod.and.returnValue( of(mockServiceResponse ) );

Проблема в том, что;У меня есть несколько тестов, и для каждого теста вызывается ngOnInit.Когда я изменяю поля ответа службы, при каждом запуске mockServiceResponse объект изменяется, и второй тестовый пример получает измененную версию ответа.Это не проблема для компонентной сети, потому что я на самом деле получаю новый ответ каждый раз, когда вызываю метод, но для тестирования это приводит к сбою моих тестовых случаев.Любые идеи о том, как я могу получить свежую версию mockServiceResponse для каждого теста?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать beforeEach для настройки условий теста для каждого теста.Вы можете вкладывать describe и добавлять beforeEach вызовы, чтобы контролировать частоту выполнения.

В этом примере модуль вашего тестирования будет настроен один раз.Это создаст «mockServiceResponse» и макет myMethod один раз за тест в спецификации.

describe('MyComponent', () => {
    const myServiceSpy = jasmine.createSpyObj('MyService',['myMethod'])    

    beforeEach(() => {
        /* 
         * Set up angular testing module
         * Declare your component(s)
         * Provide your spy as the implementation for the service you want to mock
         * This will run once for the entire spec
         */ 
    });

    describe('some more specific description', () => {
       //This will run before each test
       beforeEach(() => {
            let mockServiceResponse = {
                list: [],
                ...
            };
            myServiceSpy .myMethod.and.returnValue( of(mockServiceResponse ) );
        });

        it('does something', () => {
            //run your test
        });

        it('does another thing', () => {
            //run your test
        });
    });
});
0 голосов
/ 28 февраля 2019

Вы можете использовать useThisValue = JSON.parse(JSON.stringify(mockValue)), чтобы скопировать весь объект из значения макета и использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...