我想知道,当我尝试测试更新记录时的Capybara + Rspec功能时,如果记录被更新,我无法捕捉到它?
例如,我有测试:
scenario "updates list" do
@student = FactoryGirl.create(:student)
@stream.students << @student
FactoryGirl.create(:account, :account_holder=>@student)
visit program_stream_path(@program, @stream)
click_link "Редактировать список студентов"
expect(current_path).to eq edit_students_list_stream_path(@stream)
within("#student_0") do
fill_in "Имя", :with => "Имя"
fill_in "Фамилия", :with => "Фамилия"
fill_in "Электронная почта", :with => "randommail@mail.ru"
print page.html
end
#print page.html
click_button "Сохранить изменения"
expect(current_path).to eq program_stream_path(@program, @stream)
expect(page).to have_content "randommail@mail.ru"
end
通过此测试,我可以确保没有路由错误并且处理了操作,但我无法检查该记录是否实际更新了?
expect(page).to have_content "randommail@mail.ru"
此行会导致失败,但正如您所看到的,我使用此值填充了电子邮件字段。在浏览器中,我可以看到记录已更新。那么,Capybara不适合测试这部分应用程序吗?
编辑:我在提交后添加了print page.html
,相关输出:
<table class="table spacer">
<tr>
<th>Фамилия и имя</th>
<th>Электронная почта</th>
<th>Телефон</th>
</tr>
<tr><td>Surname1 Name1</td>
<td>somemail1@mail.ru</td> #email unchanged
<td>89112223321</td>
</tr>
</table>
浏览器操作日志:
{"student":[{"id":"378","account":{"name":"testname","surname":"testsurname","email":"randommail@mail.ru","phone":""}}]}
UPDATE "accounts" SET "password_digest" = $1, "email" = $2, "updated_at" = $3 WHERE "accounts"."id" = $4 1 ms
/Users/slava/RubymineProjects/lms/lib/list.rb:29 COMMIT
电子邮件已更新。
答案 0 :(得分:0)
感谢这里的评论者,谁给了我一个线索。
我首先想到的可能是Capybara不是为了测试ActiveRecord交互而设计的(因为有模型和控制器RSpec测试),所以我没有尝试过调试场景本身。
现在我通过了测试。
@student = FactoryGirl.create(:student)
FactoryGirl.create(:account, :account_holder=>@student)
此行是问题的根源,如果确切说话则创建帐户。
student
声明的我的FactoryGirl后来(在关注此规范之前)延伸了
after(:build) {|student| student.account = build(:account, :account_holder =>student )}
所以在这里我在一个@student
上有两个帐户工厂(因为学习page.html我发现了两个字段组,我应该有一个),因此更改了第一个组,即最后创建的帐户。
但在我的模特学生中:
has_one :account, :as => :account_holder
因此,提交第一个Account
记录的页面输出数据后,表单上的第二个(我更新了第一个,从未显示过)