Rails - Rspec:测试PUT更新以实际更改模型属性

时间:2017-09-01 07:37:44

标签: ruby-on-rails rspec

我有以下内容:

let(:update_request) { put "/api/v3/account/profile.json", attributes, credentials }

describe "PUT 'update'" do
  before { update_request }

  context "updating normal attributes (no password)" do
    let(:attributes) {
      {
        profile: { first_name: 'John', phone: '02 21231321', email: 'aieie@brazorf.com' }
      }
    }

    it do
      aggregate_failures do
        # expect{response}.to change{current_user.reload.email}.to('aieie@brazorf.com')
        expect(response).to be_success
        expect(current_user.reload.first_name).to eq('John')
        expect(current_user.reload.phone).to eq('02 21231321')
        expect(current_user.reload.email).to eq('aieie@brazorf.com')
      end
    end
  end
...

上述代码中注释掉的期望失败,并显示以下消息:

  

失败/错误:期望{response}。更改{current_user.reload.email} .to('aieie@brazorf.com')          预期结果已更改为“aieie@brazorf.com”,但未更改

如何测试对控制器PUT /更新操作的调用是否实际更改了Model属性?

修改

如果我在失败的测试之前和之后检查并评估current_user with binding.pry,我看到它实际上发生了变化。测试仍然失败

binding.pry
expect{response}.to change{current_user.reload.email}.to('aieie@brazorf.com')
binding.pry

2 个答案:

答案 0 :(得分:0)

您应该在期望之前重新加载对象:

current_user.reload
expect(current_user.email).to eq('new@ya.com')

或者另一种方式:

it do
  expect do
    subject
    user.reload
  end.to change(user, :email).from('test@ya.com').to('new@ya.com')
end

答案 1 :(得分:-2)

您已更改下面的期望代码,以便使用更改,从和到

expect {
  put "/api/v3/account/profile.json", attributes, credentials
}.to change{current_user.reload.email}.to('aieie@brazorf.com')

实际上,在它阻止中放置请求语句(GET,PUT,POST和DELETE)是好的,这样我们就可以使用rspec expec功能了