2015-08-28 3 views
0

Я пытаюсь проверить некоторые полномочия на моем сайте, используя RSpec & Capybara. Идея состоит в том, что статью можно редактировать только администратором объявления или человеком, который написал статью. Я не использую никаких драгоценных камней, всего несколько простых правил.Простой авторизационный тест с RSpec & Capybara с ошибкой

Это моя спецификация:

require 'rails_helper' 
require 'capybara/rspec' 

describe "the authorization process", :type => :feature do 
    before :each do 
    @user = User.new(:id => 3, :email => '[email protected]', :password => 'password', :password_confirmation => 'password', :username => 'Dummy User') 
    @user.save 
    end 

    it "does not allow a registered user to edit others' articles" do 
    visit '/login' 
    within("#new_user") do 
     fill_in 'Email', :with => '[email protected]' 
     fill_in 'Password', :with => 'password' 
    end 
    click_button 'Log in' 
    expect(page).to have_title 'Website Name' 
    expect(page).to have_content 'Signed in successfully!' 

    # Seems to be working up to here 

    visit section_path('mysection') 

    click_link 'Some link on the page' 
    expect(current_path).to eq(my_article_path(section: 'mysection', year: 2014, month: 10)) 
    end 
end 

но работает это возвращает следующее сообщение об ошибке:

Failures: 

    1) the authorization process does not allow a registered user to edit others' articles 
    Failure/Error: click_link 'Some link on the page' 
    NoMethodError: 
     undefined method `username' for nil:NilClass 
    # ./app/controllers/articles_controller.rb:38:in `show' 

Так я смотрю на articles_controller.rb файл и найти:

34 def show 
35 if @article.nil? 
36  redirect_to root_path, alert: "Oops! There are no articles matching a url ending in \"#{params[:id]}\"" 
37 else 
38  @username = @article.user.username 
39 end 
40 end 

Я попытался использовать pry, чтобы увидеть, что происходит прямо перед @username = @article.user.username линия. Похоже, что мой объект @article существует, но вызов .user из моего теста возвращает nil и, как следствие, вызывая .username, он также возвращает ноль, вызывая неудачный тест.

Это работает в разработке и производстве, просто не в тесте. Мне интересно, как я могу это исправить?

Спасибо!

+0

Где вы создаете статью в тесте? –

+0

Не знаю. Как ни странно, pry показывает мне, что объект '@ article' существует, когда я попал в метод show в контроллере статей. – DaniG2k

+0

О, я думаю, я понял ... Я думаю, мне нужно создать пользователя, на который ссылается эта конкретная статья. Я дам ему попробовать. – DaniG2k

ответ

1

Try незавершенная username из article так, что это не nil, когда она вызывается:

before(:each) {allow(@article.user).to receive(:username).and_return('username')} 
Смежные вопросы