【问题标题】:created data did not appear when testing测试时没有出现创建的数据
【发布时间】:2013-08-24 21:05:05
【问题描述】:

嘿,我是 BDD 测试的新手,特别是测试。我正在使用 rspec、factory_girl_rails、selenium 和 capybara gem。我想测试编辑数据并像这样保存它:

  it "edit consultant" do
    # c = FactoryGirl.create(:consultant)
    c = Consultant.create(
      orgorcom: "xyz",
      year_id: 8,
      bidang: "IT & Networking",
      project: "E-Sw",
      professional_fee: "1000000",
      role: "Database Architect",
      user_id: 19,
      nopkj: "075899 "
      )
    visit "/consultants?year=#{Time.now.year}"
    string = "#consultant#{c.id}"
    page.find(string).click_link('Edit')
    fill_in "Organization / Company" , :with => c.orgorcom + "aaa"
    fill_in "Field", :with => c.bidang + "aaa"
    fill_in "Project" , :with => c.project + "aaa"
    fill_in "Role", :with => c.role + "aaa"
    fill_in "Professional fee", :with => c.professional_fee + 111
    click_button "Save"
    expect(page).to have_content "Data updated."
    sleep 10
    # c.destroy
    # find('a[href="/consultants/6144/edit?year=2013"]').click
  end

但我创建的数据没有出现,我收到了这条消息

  1) the consultation edit consultant
     Failure/Error: page.find(string).click_link('Edit')
     Capybara::ElementNotFound:
       Unable to find css "#consultant6157"

当我尝试点击下面的现有数据时,它通过了。

page.find("#consultant6144").click_link('Edit')

我能够打印出顾问 id,但在测试结束之前记录仍然神秘地没有出现(数据库将回滚)。

【问题讨论】:

  • 我看不出这与 FactoryGirl 有什么关系。您注释掉了调用 FactoryGirl 的行。您只是使用 .create 创建一个对象——这是一个 Rails 方法,而不是 FactoryGirl 方法。
  • 您是否为当年的顾问分页超过一页,以至于最近添加的顾问不在页面上?
  • @PeterAlfvin 不,我没有分页,所有数据都是可见的。
  • @depa, (0.2ms) RELEASE SAVEPOINT active_record_1 (0.6ms) ROLLBACK,这是 FactoryGirl 的功能还是什么?
  • 这与 FactoryGirl 完全无关。那是你的测试框架为你处理你的测试数据库。

标签: ruby-on-rails rspec capybara factory-bot


【解决方案1】:

如果您使用 Selenium 进行浏览器测试,这是一个已知问题,并且在您的 spec_helper 中配置了事务性固定装置。 Selenium 将在不同的线程中运行,并使用与 Rspec 用于在事务中创建数据库对象的数据库连接不同的数据库连接,因此 Selenium 线程将无法看到它们。

对于这类规范,您不需要使用事务性固定装置,而是使用 database_cleaner 之类的东西在规范开始时创建对象,然后截断/删除它们。

【讨论】:

  • 我想使用我的开发数据库中的可用数据。这怎么可能?不同的数据库连接没有找到我的记录甚至很难它是同一个数据库?这听起来很奇怪
  • 您不能也不应该在测试时使用您的开发数据库。你有一个测试数据库。
  • 但是我正在测试的应用程序有很多记录依赖项。我正在尝试 Capybara.app_host = "thissystem.dev" 但我得到 Errno::ECONNREFUSED: Connection denied - connect(2)
  • 这似乎完全不相关。
【解决方案2】:

您的问题似乎与 FactoryGirl 无关。 Capybara 抛出的错误信息表明对象的 id 已正确连接到字符串中,但在页面中未找到相应的 CSS。

我建议您将 launchy gem 插入到您的 Gemfile 中:

group :development, :test do
  gem 'launchy'
end

这将使您能够在功能规范中使用save_and_open_page 方法。然后在引发错误的行之前插入此方法,如下所示:

# ...
save_and_open_page
page.find(string).click_link('Edit')
# ...

当调用save_and_open_page 时,您的默认浏览器将在同一页面打开。然后,您可以手动检查页面的 HTML 并确定它是否确实具有您要查找的元素,如果没有,为什么会发生这种情况。

【讨论】:

  • 我已经启动了 Firefox,因为我正在使用 selenium-webdriver 并且我写了 :js => true。此外,我使用 sleep 10 秒,以便在测试结束前有时间检查。我找不到我创建的记录。
猜你喜欢
  • 2020-01-02
  • 2020-11-17
  • 2013-04-15
  • 2013-08-05
  • 2011-11-04
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多