2014-11-07 4 views
0

У меня есть функция, которая проверяет, является ли строковая переменная пустой и заполняет ее значением, если это так. Этот метод работает с префиксом before_save.Rspec after_save

Я хочу написать тест rspec для этого. У меня есть фабрика модели с переменной в концерне пустой. Как проверить, изменилась ли переменная после сохранения?

До сих пор у меня есть,

it 'should autofill country code' do 
    empty_country_code = '' 
    @store = Factory.build(:store, :country_code => empty_country_code) 
    @store.save 
    @store.country_code.should eql '1' 
end 

ответ

0

Я бы с чем-то вроде этого:

describe 'before_save' do 
    let!(:store) { Factory.build(:store, :country_code => '') } 

    it 'autofills the country_code' do 
    expect{ store.save }.to change{ store.country_code }.from('').to(1) 
    end 
end 
+0

Странно. Я получил это: NoMethodError: undefined method 'country_code 'для nil: NilClass –

+0

Вы скопировали строку' subject ...'? – spickermann

+0

я сделал. Я читаю свой тест, чтобы узнать, что происходит. Из того, что я нашел, хранилище, вложенное в его утверждение, равно nil. –

1

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

Например, если установить метод before_save и изменить country_code к 1 в нем, вы можете сделать:

it 'should autofill country code' do 
    empty_country_code = '99' 
    @store = Factory.build(:store, :country_code => empty_country_code) 
    @store.save 
    expect(Store.find_by(id: @store.id).country_code).to eq("1") ## data get from database again 
    ## test for more, you can do: 
    ## @new_store = Store.find_by(id: @store.id) 
    ## @new_store.country_code += 100 
    ## @new_store.save 
    ## expect(Store.find_by(id: @store.id).country_code).to eq("1") 
end 

Это работать гарантирует, что данные в базе данных уже обновить.

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