ruby-on-rails - Rspec+Capybara - 它不会改变任何记录?

标签 ruby-on-rails rspec capybara

我想知道,当我尝试测试更新记录等 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

和电子邮件更新。

最佳答案

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

我首先想到可能是 Capybara 不是为了测试 ActiveRecord 交互而设计的(因为有模型和 Controller RSpec 测试),所以我没有尝试调试场景本身。

现在我通过了测试。

    @student = FactoryGirl.create(:student)
    FactoryGirl.create(:account, :account_holder=>@student)

这行是问题的根源,如果说准确的话,会创建帐户。

我的厂妹 student声明后来(在注意本规范之前)扩展为
after(:build) {|student| student.account = build(:account, :account_holder =>student )}

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

但在我的模型学生中:
has_one :account, :as => :account_holder

所以在提交第一个 Account 的页面输出数据之后记录,这是表单上的第二个(我更新了第一个,从未显示过)

关于ruby-on-rails - Rspec+Capybara - 它不会改变任何记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467422/

相关文章:

ruby-on-rails - 我如何从我的 React 应用程序发布到 facebook?

mysql - Ruby on Rails database.yml 中的套接字声明是什么?

ruby-on-rails - 测试 'create' Controller 操作的正确方法是什么?

ruby-on-rails - 我应该如何使用 Rspec 和 Capybara 测试 Omniauth?

ruby - 如何动态地向 SitePrism 页面对象添加一个部分?

ruby-on-rails - 在我的 Rails Controller 方法中运行线程

ruby-on-rails - 如何配置 Carrierwave 以使用多个 CDN CNAME url

ruby - 通过 Guard 运行由行号指定的规范

selenium - 使用 docker 和 Capybara 在主机中运行 selenium

ruby - 如何在 Capybara 中获取 DOM 元素的 HTML?