2014-01-23 2 views
1

Как мне включить методы FactoryGirl, такие как create непосредственно внутри контекста?Включить методы FactoryGirl в контексте RSpec?

Например, когда я нахожусь вне контекста, это будет работать

role_all = create(:role, name: 'all') 

Потому что в моем spec_helper.rb у меня есть следующие,

config.include FactoryGirl::Syntax::Methods 

Но когда я внутри контекста, мне нужно включить FactoryGirl. до вызова метода, например так,

context 'has role all' do 
    role_all = FactoryGirl.create(:role, name: `all`) 
    subject(:user) { FactoryGirl.create(:user, roles: [ role_all ]) } 
    # test assumptions on user 
end 

У кого-нибудь есть идея?

+0

Зачем вы хотите назвать это за пределами любого примера? – BroiSatse

+0

Поскольку контекст - это настройка данных, которые будут использоваться каждым тестом. Редактирование, чтобы сделать его более ясным. –

ответ

4

Вы не должны настраивать данные внутри контекста - он читается только один раз, когда rspec собирает все примеры и больше не будет выполнен. Если он работает в данный момент, это происходит только потому, что вы не сбрасываете свой db для каждого теста, что может привести к некоторым проблемам. Вместо того, чтобы использовать before крючки:

context 'has role all' do 
    before(:each) { @role_all = create(:role, name: `all`) } 
end 

отметить также, что subject блок не выполняется, если она объявлена ​​- она ​​будет выполняться каждый раз, когда вы вызываете объект в тесте. Поскольку ruby ​​procs несут контекст, в котором они были созданы, role_all, объявленный в вашем коде, не будет создавать никаких исключений. Однако ваш subject будет возвращать разные объекты каждый раз, когда вы его вызываете, и это может привести к пропуску вашего теста.

TL; DR:

Контекст не удалось установить данные для испытаний - это установить функции, которые будут выполняться до или после каждого испытания.

+0

Вау, это объясняет некоторые проблемы с тестированием, которые у меня были раньше, спасибо! –

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