2016-02-04 3 views
1

Я пытаюсь проверить метод set_random_token видно ниже из моей моделиRspec тестирование before_create крюк

class Invitation < ActiveRecord::Base 

     has_and_belongs_to_many :users 

     validates :name, presence: true, uniqueness: true 
     validates :number_of_uses, presence: true, numericality: true 
     validates :token, presence: true, uniqueness: true, format: /\A[0-9A-F]+\z/i 
     before_create :set_random_token 

     private 

     def set_random_token 
     random_hex = SecureRandom.hex(8) 
     self.token = random_hex 
     end 

    end 

Вот часть в моем invitation_spec

it 'verifies that the token is set' do 
    @invitation = Invitation.new 
    @invitation.save 
    expect(@invitation.token).not_to be_empty 
end 

А вот ошибка я m получение

2) Invitation verifies that the token is set 
    Failure/Error: expect(@invitation.token).not_to be_empty 
     expected to respond to `empty?` 
    # ./spec/models/invitation_spec.rb:37:in `block (2 levels) in <top (required)>' 

Я довольно новичок в Rails, поэтому извиняюсь, если ответ предельно очевиден.

+0

Я подозреваю, что вы ударяя ошибка проверки, прежде чем вы получите, насколько экономии. Используйте 'save!' Вместо 'save', чтобы узнать, так ли это. –

ответ

2

Я видел раз, когда проверка содержимого атрибута/столбца из локальной или экземпляра переменной записи не дают такой же ожидаемый результат. Обходной путь, который я использовал в прошлом, заключается в запросе записи с .first и проверке столбца на этом.

Чтобы убедиться, что вы действительно получаете правильную запись, вы добавляете expect(Table.count).to eq 0 в начале.

Дайте это попробовать

it 'verifies that the token is set' do 
    expect(Invitation.count).to eq 0 
    Invitation.new().save(validate: false) 
    expect(Invitation.count).to eq 1 
    expect(Invitation.first.token).not_to be_empty 
end 
0

От Rails Documentation:

следующие способы запуска проверок, и сохранит объект в базу данных, только если объект является действительным:
- сохранить

В тесте, вы создают экземпляр пустого приглашения, но приглашение имеет ряд проверок на нем, что сделало бы пустой один недопустимым.

Попробуйте вместо этого:

@invitation = Invitation.create({name: 'something unique', number_of_uses: 5}) 
expect(@invitation.token).not_to be_empty 
@invitation.save 
+0

то, что вы предложили, имеет смысл, но, похоже, это не делает трюк. он по-прежнему дает мне ту же ошибку – Spance

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