我正在使用RSpec来测试我的Rails5应用程序,并且在删除或更新对象方面遇到问题。也就是说,该应用程序正常运行,但是如果我测试其中一些功能,则测试将失败。
测试1
DRF serializer
如果我以管理员身份在浏览器中进行浏览,则可以更新属性。
测试2
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
再次,如果我手动执行此操作,并使用byebug或rails控制台检查所有内容,则该用户不再拥有 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
。因此,这两个是系统规格,我想知道是否误解了如何正确测试。由于我阅读了系统规格,因此我通过模拟用户行为来测试整个系统,因此我还可以检查控制器操作是否正确执行。
但是在我的模型规格中,它也不应该像下面那样工作:
测试3
friend_request
我认为这将是对模型的适当测试,因为它应该由于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
而起作用。
现在,我想知道我的代码中是否存在我似乎无法弄清的错误,或者我的大脑中是否存在错误的概念。
任何帮助和澄清将不胜感激!谢谢。
答案 0 :(得分:1)
您需要通过user
重新加载user.reload.friend_requests
对象。测试中的内存对象尚未进行任何更新处理。