【发布时间】:2016-10-17 14:24:18
【问题描述】:
我们有一个 RSpec 测试要运行,它使用 selenium 运行 js: true。也就是说,当您运行测试时,它会在您面前启动 firefox 并通过测试本身。
我们的测试是监管一个单页的 Angular 应用程序,需要在应用程序周围进行导航,然后直接操作数据库以查看前端如何响应它。
context "in my single page Angular application" do
context "given I go to a user's profile page" do
it "should contain the user's profile photo" do
visit profile_page_url
expect(page).to have_text(profile_photo_url)
end
context "and then I go to the homepage, remotely destroy the photo and return to the profile page" do
before :each do
visit homepage_url
profile_photo.destroy
visit profile_page_url
end
it "expects the profile photo to be gone" do
expect(page).not_to have_text(profile_photo_url)
end
end
end
end
在上面的示例中,您可以看到我们转到用户的个人资料页面,检查他们的照片是否在那里,然后转到主页。当我们在主页上时,我们会销毁用户的个人资料照片(直接使用脚本而不是界面),然后返回原始页面查看它是否消失了。或者至少这是我们在理论上所做的。
看起来这两个进程在不同的线程/事务中
实际上,一旦我们删除了照片,一切都会挂起。 Reading up on this 似乎这可能是由于控制台和硒在不同的进程(线程?)中并行运行两个不同的数据库事务。控制台正在等待 Selenium 完成,然后才能执行其数据库查询。
从表面上看,我们似乎陷入了困境。有趣的是,看起来我们不能在 Selenium 运行的同时进行直接的数据库操作,因为一个事务正在等待另一个事务完成。
如果我们将binding.pry 调试器语句放入其中,则可以做到这一点。但它在测试套件中不起作用。
是否可以通过 Selenium 会话同步操作数据库
我们需要能够在同一会话期间通过控制台和 Selenium 直接更改数据库。这可能吗?
【问题讨论】:
-
您是正确的,因为您的测试和 selenium 正在浏览的 Rails 服务器在不同的进程中运行。通常在使用工厂时,使用
database_cleaner在规范之间擦除数据库是一个非常好的主意 - 因为残留状态会导致误报和抖动测试。 -
即使该规范毫无用处-您只是在测试您的测试是否有效...而是通过前端销毁记录。
-
这不是没用的@max,它正在测试假设照片是通过另一种方式(例如移动应用程序)销毁的,该应用程序是否正确地将其从界面中删除。由于它是一个 SPA,风险在于它仍然会显示照片,即使它不再存在于后端。我们不想清理数据库,我们只需要操纵它来模仿它
-
如果您有一个可以删除个人资料图片的 API 路由,您也许可以获得Capybara driver to send a DELETE request。但是它是特定于驱动程序的,我不知道 selenium-webdriver 是否可行。这样可以避免挂起的数据库问题。
标签: ruby-on-rails selenium rspec