Rspec测试失败,即使手动操作一切正常

问题描述 投票:1回答:1

我正在使用RSpec来测试我的Rails5应用程序,并且在删除或更新对象方面遇到问题。也就是说,该应用程序正常运行,但是如果我测试其中一些功能,则测试将失败。

测试1

let!(:user) { create(:user) }
let!(:admin) { create(:admin) }
let!(:new_name) { 'new name' }

it 'changes user name' do
    visit(user_path(user))
    click_on('Edit')
    expect(current_path).to eq(edit_user_as_admin_path(user))
    fill_in('Name', with: new_name)
    click_on('Update')
    expect(current_path).to eq(user_path(user))
    expect(user.name).to eq(new_name)
end

如果我以管理员身份在浏览器中进行浏览,则可以更新属性。

测试2

  let!(:user){create(:user)}
  let!(:friend){create(:user)}

  before(:each){sign_in friend
    visit(user_path(user))
    click_on('Add Friend')
    sign_in user
  }

  it 'is accepted' do
    visit(user_path(user))
    click_on('Accept')
    expect(user.friend_requests).to be_empty
 end

再次,如果我手动执行此操作,并使用byebug或rails控制台检查所有内容,则该用户不再具有friend_request。因此,这两个是系统规格,我想知道是否误解了如何正确测试。由于我阅读了系统规格,因此我通过模拟用户行为来测试整个系统,因此我还可以检查控制器操作是否正确执行。

但是在我的模型规格中,它也不像应该那样工作:

测试3

let!(:user){create(:user)}
let!(:post) {create(:post)}

it 'is deleted if user is deleted' do
  user.posts << post
  expect do
    user.destroy
  end.to change(user.posts,:count).by(-1)
end

我认为这将是对模型的适当测试,因为它会因dependent: :destroy而起作用。

现在,我想知道我的代码中是否存在我似乎无法弄清楚的错误,或者我的大脑中是否存在错误的概念。

任何帮助和澄清,我们将不胜感激!谢谢。

ruby-on-rails rspec ruby-on-rails-5
1个回答
0
投票

您需要通过user重新加载user.reload.friend_requests对象。测试中的内存对象尚未进行任何更新处理。

© www.soinside.com 2019 - 2024. All rights reserved.