TypeError: Невозможно установить свойство 'variable' из undefined при установке this.variable в BeforeEach. - PullRequest
2 голосов
/ 31 марта 2020

Я новичок в Javascript. У меня следующий код, следующий точно за { ссылка }

  describe('tests', () => {
    beforeEach(async () =>
      Promise.resolve('foo').then(result => {
        this.dom = result;
      })
    );

    it('works', () => {
      console.log(this.dom); // => foo
    });
  });

При запуске теста он жалуется

1) tests
       "before each" hook for "works":
     TypeError: Cannot set property 'dom' of undefined

Я что-то пропустил?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Самый простой способ - исключить использование this и объявить переменную в области обратного вызова describe():

  describe('tests', () => {
    let dom;
    beforeEach(async () =>
      Promise.resolve('foo').then(result => {
        dom = result;
      })
    );

    it('works', () => {
      console.log(dom); // => foo
    });
  });
1 голос
/ 31 марта 2020

Вы используете функцию стрелки в своем обещании then и в тесте it функций обратного вызова.

Перед функциями стрелки каждая новая функция определяла свое значение на основе этого значения. о том, как была вызвана функция:

  • Новый объект в случае конструктора.
  • undefined в вызовах функций строгого режима.
  • Базовый объект, если Функция была вызвана как «метод объекта».

Итак, проблема с вашим кодом состоит в том, что в области действия стрелки функции обратного вызова теста this относится к родительской области блока describe .

Функция стрелки не имеет своей собственной this. Используется значение this лексической области видимости; Функции стрелок следуют нормальным правилам поиска переменных. Таким образом, при поиске этого, которого нет в текущей области видимости, функция стрелки заканчивает тем, что находила this из включенной области видимости.

В качестве одной из опций вы можете определить переменную в родительской области видимости в блоке describe и использовать его в beforeAll и it обратном вызове.

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