2016-07-18 8 views
0

У меня есть метод в моем контроллере, который выглядит следующим образом:разница между ожидать и expect_any_instance_of

def resend_confirmation 
    @current_user.send_confirmation_instructions 

    render json: nil, status: 200 
end 

Я написал следующую спецификацию для этого метода:

require 'rails_helper' 

describe 'POST /api/v1/users/:id/resend_confirmation' do 
    let!(:current_user) { create(:user) } 

    before do 
    expect(current_user).to receive(:send_confirmation_instructions) 

    post resend_confirmation_api_v1_user_path(current_user), 
     headers: http_authorization_header(current_user) 
    end 

    describe 'response' do 
    it 'is empty' do 
     expect(response.body).to eq 'null' 
    end 
    end 

    it 'returns 200 http status code' do 
    expect(response.status).to eq 200 
    end 
end 

Но проблема в том, что этой спецификации не проходит. Эта линия не удается:

expect(current_user).to receive(:send_confirmation_instructions) 

, когда я меняю что

expect_any_instance_of(User).to receive(:send_confirmation_instructions) 

все работает довольно хорошо. Может ли кто-нибудь объяснить мне, почему спецификация с ожидаемым синтаксисом не проходит?

EDIT:

Это как выглядит ошибка:

Failures: 

    1) POST /api/v1/users/:id/resend_confirmation returns 200 http status code 
    Failure/Error: expect(current_user).to receive(:send_confirmation_instructions) 

     (#<User id: 4175, email: "[email protected]", date_of_birth: "1990-01-01", created_at: "2016-07-18 06:56:52", updated_at: "2016-07-18 06:56:52", sex: "male", touch_id_enabled: false, first_name: "Test", last_name: "User", athena_health_patient_id: nil, photo_url: nil, admin: false, one_signal_player_id: "1", phone_number: nil, state: nil, address: nil, city: nil, zip_code: nil, phone_number_confirmed: false>).send_confirmation_instructions(*(any args)) 
      expected: 1 time with any arguments 
      received: 0 times with any arguments 
    # ./spec/requests/api/v1/user/resend_confirmation_spec.rb:7:in `block (2 levels) in <top (required)>' 

    2) POST /api/v1/users/:id/resend_confirmation response is empty 
    Failure/Error: expect(current_user).to receive(:send_confirmation_instructions) 

     (#<User id: 4176, email: "[email protected]", date_of_birth: "1990-01-01", created_at: "2016-07-18 06:56:53", updated_at: "2016-07-18 06:56:53", sex: "male", touch_id_enabled: false, first_name: "Test", last_name: "User", athena_health_patient_id: nil, photo_url: nil, admin: false, one_signal_player_id: "2", phone_number: nil, state: nil, address: nil, city: nil, zip_code: nil, phone_number_confirmed: false>).send_confirmation_instructions(*(any args)) 
      expected: 1 time with any arguments 
      received: 0 times with any arguments 
    # ./spec/requests/api/v1/user/resend_confirmation_spec.rb:7:in `block (2 levels) in <top (required)>' 
+0

Я обновил сообщение. –

+0

вы можете попробовать ожидать (User.find (current_user.id)). Получать (: send_confirmation_instructions)? – power

ответ

1

expects(...) устанавливает ожидания на конкретном примере. Когда запрос POST будет выполнен, ваше приложение попытается определить пользователя, на который ссылается ваша информация о запросе, и создаст экземпляр, который представляет его.

Однако этот экземпляр не является тем же, который вы подготовили в своем тесте. Он действительно ссылается на один и тот же объект пользователя, но это не тот же объект Ruby.

Следовательно, в ваших тестах используется current_user, а не тот, на который вы надеетесь.

Использование expect_any_instance_of вместо этого влияет на каждый экземпляр созданного пользователя, а также на тот, который будет создан для удовлетворения запроса.

 Смежные вопросы

  • Нет связанных вопросов^_^