Я тестирую свой контроллер, чтобы убедиться, что вызывается класс библиотеки и что функциональность работает так, как ожидалось. NB : Возможно, об этом спрашивали где-то еще, но мне нужна помощь с моей конкретной проблемой. Мне также хотелось бы узнать, как лучше всего это проверить.
Чтобы лучше объяснить мою проблему, я предоставлю контекст через код.
У меня в папке /Lib
есть класс, который генерирует события (не против, если вы не понимаете, что это значит). Класс выглядит примерно так:
class ChangeEmitter < Emitter
def initialize(user, role, ...)
@role = role
@user = user
...
end
def emit(type)
case type
when CREATE
payload = "some payload"
when UPDATE
payload = "some payload"
...
end
send_event(payload, current_user, ...)
end
end
Вот как я использую его в моем контроллере:
class UsersController < ApplicationController
def create
@user = User.new(user_params[:user])
if @user.save
render :json => {:success => true, ...}
else
render :json => {:success => false, ...}
end
ChangeEmitter.new(@user, @user.role, ...).emit(ENUMS::CREATE)
end
end
Извините, если какой-то код не имеет смысла, я пытаюсь объяснить проблему, не раскрывая слишком много кода.
Вот что я попробовал для своих тестов:
describe UsersController do
before { set_up_authentication }
describe 'POST #create' do
it "calls the emitter" do
user_params = FactoryGirl.attributes_for(:user)
post :create, user: user_params
expect(response.status).to eq(200)
// Here is the test for the emitter
expect(ChangeEmitter).to receive(:new)
end
end
end
Я ожидаю, что класс ChangeEmitter
получит new
, поскольку он вызывается сразу после выполнения действия create.
Вместо этого я получаю сообщение об ошибке:
(ChangeEmitter (class)).new(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
Чего мне не хватает в приведенном выше коде и почему класс не получает новый. Есть ли лучший способ проверить вышеуказанную функциональность? Обратите внимание, что это Rspec. Ваша помощь будет высоко ценится. Спасибо.