2014-11-10 3 views
1

Протестировано в браузере и прекрасно работает. Ошибка теста говорит, что «ожидаемый результат изменился с 0 на 1, но не изменился». Это проблема фабрики или проблема с rspec? Почему это не меняется?Rspec тестирует контроллер, используя от?

Ошибка:

Failures: 

    1) ShortLinksController Short links controller Clicking a short link increments the click counter by 1 
    Failure/Error: expect{ get :url_dispatch, { id: short_link.short_link } }.to change{short_link.click_counter}.from(0).to(1) 
     expected result to have changed from 0 to 1, but did not change 
    # ./spec/controllers/short_links_controller_spec.rb:34:in `block (4 levels) in <top (required)>' 

Rspec:

it "increments the click counter by 1" do 
    short_link = create(:short_link) 
    expect{ get :url_dispatch, { id: short_link.short_link } }.to change{short_link.click_counter}.from(0).to(1) 
    end 

Контроллер:

def url_dispatch 
    id = params[:id] 
    record = ShortLink.where(["short_link = ?", id]).first 

    if record.update(click_counter: record.click_counter + 1) 
     redirect_to record.redirect_to 
    else 
     render '/not_found' 
    end 
    end 

Фабрика:

FactoryGirl.define do 
    factory :short_link do 
    redirect_to "http://google.com" 
    title "This is the google page" 
    short_link "xGh7u" 
    click_counter 0 
    owner Owner.create!(first_name: "Bob", last_name: "Diller", email: "[email protected]") 
    end 
end 
+0

Я думаю, что это вопрос «FactoryGirl», основанный на том, что тот же код работает нормально, если вы вызываете модель вместо фабрики. Я использую 'reload', чтобы обойти это сейчас в своих тестах контроллера, но мне любопытно, есть ли у кого-нибудь ответ. – Anthony

+0

Эй, Энтони, это интересно. Я думаю, что это проблема FG. Можете ли вы опубликовать свою работу в качестве ответа. Благодарю. – fyz

ответ

1

за запрос Fab, вот как я сейчас работаю над проблемой.

context 'save invocations' do 
    before(:each) do 
    @org = create(:organization) 
    user = create(:user, organization: @org, is_admin: true) 
    sign_in user 
    end 
    it 'valid scenario' do 
    user2 = create(:user, organization: @org, is_admin: false) 
    put :update, id: user2, user: { is_admin: true } 

    user2.reload 
    expect(response).to have_http_status(204) 
    expect(user2.is_admin).to eq true 
    end 
end 

Здесь я звоню user2.reload, чтобы получить обновленные атрибуты из user2 завода.

Я не знаю, почему синтаксис expect{} не работает на заводах, но вы могли бы реорганизовать код так:

it "increments the click counter by 1" do 
    short_link = create(:short_link) 
    count = short_link.click_counter 
    get :url_dispatch, { id: short_link.short_link } 
    short_link.reload 

    expect(short_link.click_counter).to eq count + 1 
    end 

Опять же, я не говорю, что это лучшая практика, я просто не мог» t найти что-либо в документации FactoryGirl относительно RSpec 3 ожидать синтаксиса в контроллерах, которые обновляют атрибуты.

+1

Спасибо Anthony +1 за эту рабочую реализацию. – fyz

+1

Я пытался исследовать это и из того, что мог найти, я начинаю верить, что это правильная реализация. Если кто-то не приходит и не дает лучшего способа. Я приму свой ответ. – fyz

+0

Звучит неплохо - мне любопытно, есть ли у кого-либо из основной команды FactoryGirl какие-либо «лучшие практики». – Anthony