2014-11-20 4 views
0

RSpec до: каждый цикл действительно вызывает проблему для меня, поскольку он, похоже, не хочет применяться к каждому блоку, но только тот, который непосредственно перед ним , Вот вся моя спецификация файла:RSpec before (: each) Отказ от игры Nice

require 'rails_helper' 

DatabaseCleaner.strategy = :truncation 
DatabaseCleaner.clean 

RSpec.describe User, :type => :model do 

    describe "(1) Has Associations and Test Data" do 
    context "(a) has a valid factory" do 
     it { expect(build(:user)).to be_valid } 
    end 

    context "(b) belongs to a company" do 
     it { expect(User.reflect_on_association(:company).macro).to eq(:belongs_to) } 
    end 

    context "(c) has many shifts" do 
     it { expect(User.reflect_on_association(:shifts).macro).to eq(:has_many) } 
    end 
    end 

    describe "(2) JSON API Methods for current_user" do 

    before(:each) do 
     DatabaseCleaner.clean 
     @user = FactoryGirl.create(:user) 
     @schedule = FactoryGirl.create(:schedule) 
     @shift = FactoryGirl.create(:shift, user_id: @user.id, schedule_id: @schedule.id) 
    end 

    context ".shifts returns all shifts" do 
     #it { expect(@user.shifts).to eq(Shift.where(:user_id => @user.id)) } 
     it { expect(@user.shifts).to include @shift } 
    end 

    context ".last_weeks_shifts returns all shifts for LAST week" do 
     last_weeks_schedule = FactoryGirl.create(:schedule, week_num: Date.today.cweek - 1).id 
     last_weeks_shift = @shift.update_attributes(schedule_id: last_weeks_schedule) 
     it { expect(@user.last_weeks_shifts).to include last_weeks_shift} 
    end 

    context ".this_weeks_shifts returns all shifts for THIS week" do 
     it { expect(@user.this_weeks_shifts).to equal [] } 
    end 

    context ".next_weeks_shifts returns all shifts for NEXT week" do 
     it { expect(@user.next_weeks_shifts).to equal [] } 
    end 

    context ".shift_today? returns true if it has a shift today" do 
     it { expect(@user.shift_today?).to equal true or false } 
    end 
    end 
end 

В качестве ссылки, в частности, вот мой вопрос:

before(:each) do 
    DatabaseCleaner.clean 
    @user = FactoryGirl.create(:user) 
    @schedule = FactoryGirl.create(:schedule) 
    @shift = FactoryGirl.create(:shift, user_id: @user.id, schedule_id: @schedule.id) 
end 

context ".shifts returns all shifts" do 
    #it { expect(@user.shifts).to eq(Shift.where(:user_id => @user.id)) } 
    it { expect(@user.shifts).to include @shift } 
end 

context ".last_weeks_shifts returns all shifts for LAST week" do 
    last_weeks_schedule = FactoryGirl.create(:schedule, week_num: Date.today.cweek - 1).id 
    last_weeks_shift = @shift.update_attributes(schedule_id: last_weeks_schedule) 
    it { expect(@user.last_weeks_shifts).to include last_weeks_shift} 
end 

Если я называю binding.pry и исследовать свои объекты в последнем контекстный блок, вот мои результаты:

[1] pry(#<Class>)> @shift 
nil 
[2] pry(#<Class>)> @schedule 
nil 
[3] pry(#<Class>)> @user 
nil 

Почему мои объекты, которые я установил перед циклом, исчезают? Обратите внимание на переменные экземпляра ARE.

ответ

1

См rspec before(:each) using factorygirl to create model not working

переменная экземпляра, представляющая объект не создается экземпляр, пока вы на самом деле проверить его. @shift не будет существовать, если вы не проверить его, поэтому он гораздо лучше использовать пусть:

let(:user) { FactoryGirl.create(:user) } 
let(:schedule) { FactoryGirl.create(:schedule) } 
let(:shift) { FactoryGirl.create(:shift, user_id: user.id, schedule_id: schedule.id) } 

before(:each) do 
    DatabaseCleaner.clean 
end 
+0

Первый тест проходит (один непосредственно после до цикла) «.shifts возвращает все изменения», но один сразу после его отказа. – ilrein

+0

Какая ошибка вы получаете? Попытайтесь использовать let вне перед блоком. –

+0

См. Мое редактирование выше. –

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