Как проверить, что класс вызывается в методе контроллера с RSpec

Внутри первого вызова (после ... Persistence.LOCAL) у вас есть объявление функции. В отличие от функций стрелок, он не будет поддерживать текущий контекст, поэтому, когда вы используете this.router, , этот будет контекстом указанной выше функции.

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

Самый быстрый способ исправить это - использовать функции стрелок во всех местах, например:

signinUser(email: string, password: string) {
    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)
        .then(() => firebase.auth().signInWithEmailAndPassword(email, password)
                .then(
                    response => {
...

Вы можете найти дополнительную информацию о здесь .

0
задан kevinsamoei 20 January 2019 в 00:39
поделиться

1 ответ

Вы должны поместить свой код expect(ChangeEmitter).to receive(:new) над почтовым запросом. Когда вы ожидаете, что класс получит метод, ваша инструкция «ожидаем» перед вызовом контроллера. Ожидается, что что-то случится в будущем. Таким образом, ваш тест должен выглядеть примерно так:

it "calls the emitter" do    
  user_params = FactoryGirl.attributes_for(:user)

  expect(ChangeEmitter).to receive(:new)

  post :create, user: user_params

  expect(response.status).to eq(200)
end

РЕДАКТИРОВАТЬ

Заметив, что вы цепляете действие «испустить» после вызова «нового», я понял, что я необходимо обновить мой ответ для вашего конкретного случая использования. Вам нужно вернуть объект (я обычно возвращаю шпиона или двойника), который может вызвать emit. Для получения дополнительной информации о разнице между шпионами и двойниками смотрите: https://www.ombulabs.com/blog/rspec/ruby/spy-vs-double-vs-instance-double.html [116 ]

По сути, шпион принимает любой вызванный им метод и возвращает сам себя, тогда как с помощью двойного числа вы должны указать, какие методы он может принимать, а какие возвращать. Для вашего случая я думаю, что шпион работает.

Итак, вы хотите сделать это так:

it "calls the emitter" do    

  user_params = FactoryGirl.attributes_for(:user)

  emitter = spy(ChangeEmitter)
  expect(ChangeEmitter).to receive(:new).and_return(emitter)

  post :create, user: user_params

  expect(response.status).to eq(200)
end
0
ответ дан armont_development 20 January 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: