Rspec失败,但是当我通过控制器测试时行为有效

时间:2014-04-03 22:38:34

标签: ruby-on-rails ruby rspec

这应该非常简单,但由于某些原因我的测试失败了,请考虑以下模型位:

class User < ActiveRecord::Base 

  def active!
    update_attribute(:active, true)
  end

end

控制器:

def activate
    user = User.find_by_uuid(params[:id])
    user.active!

    puts "id #{user.id}"
end

测试:

describe 'activate user' do
  let(:user) { FactoryGirl.create(:user) }
      before do
        sign_in user
        visit activate_user_path(id: user.uuid)
        puts "id #{user.id}"
      end

      it 'should be true' do
        save_and_open_page
        user.active.should be_true
      end
end

此测试失败:

expected: true value
            got: false

但是当我使用浏览器时,用户会被激活而没有问题。我究竟做错了什么?这真的看起来像一个狡猾的测试,但仍然没有通过,我花了一个多小时尝试不同的东西,没有一个工作。

1 个答案:

答案 0 :(得分:2)

问题是规范仍然保留了User变量,该变量是通过FactoryGirl创建的,并且不知道数据库中是否已更改。只需重新加载user,它就应该有效:

user

顺便说一下。如果it 'should be true' do save_and_open_page user.reload.active.should be_true end 是布尔值,你也可以用这种方式进行规范(读得更好):

active