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

Rspec tests fail even though everything works fine manually

我正在使用 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

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

如有任何帮助和说明,我们将不胜感激!谢谢。

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