Rspec+Capybara - 它不会进行任何记录更改?

Joe*_*ace 5 rspec ruby-on-rails capybara

我想知道,当我尝试测试 Capybara+Rspec 功能(例如更新记录)时,我无法捕获记录是否已更新?

\n\n

例如,我有测试:

\n\n
scenario "updates list" do\n    @student = FactoryGirl.create(:student)\n    @stream.students << @student\n    FactoryGirl.create(:account, :account_holder=>@student)\n    visit program_stream_path(@program, @stream)\n    click_link "\xd0\xa0\xd0\xb5\xd0\xb4\xd0\xb0\xd0\xba\xd1\x82\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd1\x8c \xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xbe\xd0\xba \xd1\x81\xd1\x82\xd1\x83\xd0\xb4\xd0\xb5\xd0\xbd\xd1\x82\xd0\xbe\xd0\xb2"\n    expect(current_path).to eq edit_students_list_stream_path(@stream)\n    within("#student_0") do\n      fill_in "\xd0\x98\xd0\xbc\xd1\x8f", :with => "\xd0\x98\xd0\xbc\xd1\x8f"\n      fill_in "\xd0\xa4\xd0\xb0\xd0\xbc\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x8f", :with => "\xd0\xa4\xd0\xb0\xd0\xbc\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x8f"\n      fill_in "\xd0\xad\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xbe\xd1\x87\xd1\x82\xd0\xb0", :with => "randommail@mail.ru"\n    print page.html\n    end\n    #print page.html\n    click_button "\xd0\xa1\xd0\xbe\xd1\x85\xd1\x80\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x82\xd1\x8c \xd0\xb8\xd0\xb7\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n    expect(current_path).to eq program_stream_path(@program, @stream)\n    expect(page).to have_content "randommail@mail.ru"\n    end\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过此测试,我可以确保不存在路由错误并且操作已处理,但我无法检查记录是否确实已更新?

\n\n
 expect(page).to have_content "randommail@mail.ru"\n
Run Code Online (Sandbox Code Playgroud)\n\n

此行引发失败,但正如您所看到的,我用该值填充了电子邮件字段。在浏览器中我可以看到记录已更新。那么,Capybara 不适合测试这部分应用程序吗?

\n\n

编辑:我 print page.html在提交后添加了相关输出:

\n\n
<table class="table spacer">\n<tr>\n<th>\xd0\xa4\xd0\xb0\xd0\xbc\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x8f \xd0\xb8 \xd0\xb8\xd0\xbc\xd1\x8f</th>\n<th>\xd0\xad\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xbe\xd1\x87\xd1\x82\xd0\xb0</th>\n<th>\xd0\xa2\xd0\xb5\xd0\xbb\xd0\xb5\xd1\x84\xd0\xbe\xd0\xbd</th>\n</tr>\n<tr><td>Surname1 Name1</td>\n<td>somemail1@mail.ru</td> #email unchanged\n<td>89112223321</td>\n</tr>\n</table>\n
Run Code Online (Sandbox Code Playgroud)\n\n

浏览器操作日志:

\n\n
{"student":[{"id":"378","account":{"name":"testname","surname":"testsurname","email":"randommail@mail.ru","phone":""}}]}\n\n\nUPDATE "accounts" SET "password_digest" = $1, "email" = $2, "updated_at" = $3 WHERE "accounts"."id" = $4    1 ms\n/Users/slava/RubymineProjects/lms/lib/list.rb:29        COMMIT\n
Run Code Online (Sandbox Code Playgroud)\n\n

并更新了电子邮件。

\n

Joe*_*ace 0

感谢这里的评论者,他们给了我线索。

我首先想到的是 Capybara 并不是为了测试 ActiveRecord 交互而设计的(因为有模型和控制器 RSpec 测试),所以我没有尝试太多地调试场景本身。

现在我通过了测试。

    @student = FactoryGirl.create(:student)
    FactoryGirl.create(:account, :account_holder=>@student)
Run Code Online (Sandbox Code Playgroud)

这条线是问题的根源,如果准确地说,创建帐户。

我的 FactoryGirlstudent声明后来(在关注此规范之前)扩展为

after(:build) {|student| student.account = build(:account, :account_holder =>student )}
Run Code Online (Sandbox Code Playgroud)

所以在这里我在一个上有 2 个帐户工厂@student(在研究 page.html 时,我发现了两个字段组,我应该有一个),因此更改了第一个组,即最后创建的帐户。

但在我的学生模型中:

has_one :account, :as => :account_holder
Run Code Online (Sandbox Code Playgroud)

因此,在提交第一条记录的页面输出数据后Account,该记录是表单上的第二条记录(我更新了第一条记录,该记录从未显示)