Ruby on rails 带CSS和JS的水豚RSpec? 轨道(5.1.4) rspec钢轨(3.7.2) 水豚(2.16.1)
我正在尝试创建一个RSpec Rails 3.7系统规范,如中所示 以下是我的简单规范:Ruby on rails 带CSS和JS的水豚RSpec? 轨道(5.1.4) rspec钢轨(3.7.2) 水豚(2.16.1),ruby-on-rails,capybara,rspec-rails,Ruby On Rails,Capybara,Rspec Rails,我正在尝试创建一个RSpec Rails 3.7系统规范,如中所示 以下是我的简单规范: require 'rails_helper' RSpec.describe "testing system", type: :system do it "tests the spec" do visit root_path click_link 'Home' save_and_open_page end 问题是,在save\u和\u open\u page调
require 'rails_helper'
RSpec.describe "testing system", type: :system do
it "tests the spec" do
visit root_path
click_link 'Home'
save_and_open_page
end
问题是,在save\u和\u open\u page
调用(在浏览器中)之后,Capybara既不呈现CSS内容也不呈现JS内容——只是一个普通的HTML。此HTML文件中的标题包含一些链接
<link rel="stylesheet" media="all" href="/assets/application-ea5a1efcc44a908543519edabe00e74132151ebedeef3c1601921690d9162b5e.css" data-turbolinks-track="reload" />
<script src="/assets/application-ff63e43aef379fef744a00f21a8aadf96dc2ae8e612f8e7974b231f946569691.js" data-turbolinks-track="reload"></script>
但它们引用了一些空文件
有什么办法可以解决吗
我试过一些食谱,但还是没有成功。我试图预编译这些资产,将“capybara.html”移到“public”文件夹中,但没有效果。这与您的资产有关。 清除缓存并运行rake
assets:clobber
和rakeassets:precompile
仍然不走运,然后检查水豚是否配置正确。我找到了解决方案。也许这不是最好的,但它对我很有效。如果有人找到更好的方法,请告诉我
rake资产:预编译。我甚至没有设置RAILS\u ENV=test
样式表\u链接\u标记
方法:<link rel="stylesheet" media="all" href="/assets/application-ea5a1efcc44a908543519edabe00e74132151ebedeef3c1601921690d9162b5e.css" data-turbolinks-track="reload" />
.gitignore
:/public/capybara.html
对JS内容做同样的事情
更新:
如果您不喜欢修改\app\views\layouts\application.html.erb
,您可以执行一些猴子补丁:
include ActionView::Helpers::AssetTagHelper
alias_method :old_stylesheet_link_tag, :stylesheet_link_tag
def stylesheet_link_tag2(*sources)
options = sources.extract_options!.stringify_keys
path_options = options.extract!('protocol').symbolize_keys
sources.uniq.map { |source|
tag_options = {
"rel" => "stylesheet",
"media" => "screen",
"href" => path_to_stylesheet(source, path_options)[1..-1]
}.merge!(options)
tag(:link, tag_options)
}.join("\n").html_safe
end
def stylesheet_link_tag(*sources)
if Rails.env.test?
stylesheet_link_tag2(*sources)
else
old_stylesheet_link_tag(*sources)
end
end
我通常将这些代码放入app\helpers\application\u helper.rb
中,并将include ApplicationHelper
添加到app\controllers\application\u controller.rb
更新2
设置Capybara.asset\u主机=”http://localhost:3000/“
as@Thomas Walpole建议的方法不起作用。没错-如果http://localhost:3000/
是否不可用(在运行规范之后)?当然-当我调用save\u和\u open\u页面
时,HTML文件将以file://....
地址-没有HTTP服务器提供服务。试图设置
Capybara.asset_host = "file://#{Rails.root}/public"
失败-看起来像base
HTML标记只支持http
-地址-不支持file://...
1个。我在Chrome和Firefox中查看了它
因此,我的下一个代码建议是:
include ActionView::Helpers::AssetTagHelper
alias_method :old_stylesheet_link_tag, :stylesheet_link_tag
def stylesheet_link_tag2(*sources)
options = sources.extract_options!.stringify_keys
path_options = options.extract!('protocol').symbolize_keys
sources.uniq.map { |source|
tag_options = {
"rel" => "stylesheet",
"media" => "screen",
"href" => "file://#{Rails.root}/public" + path_to_stylesheet(source, path_options)
}.merge!(options)
tag(:link, tag_options)
}.join("\n").html_safe
end
def stylesheet_link_tag(*sources)
if Rails.env.test?
stylesheet_link_tag2(*sources)
else
old_stylesheet_link_tag(*sources)
end
end
这样就不需要打电话了
save_and_open_page Rails.root.join( 'public', 'capybara.html' )
相反,你可以直接打电话
save_and_open_page
检查app/views/layouts/application.html.erb是否具有用于样式表和Java脚本的正确Rails标记。大概是这样的:
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
确保公共/资产/包括:
.sprockets-manifest-<xyz>.json
application-<abc>.js
application-<def>.css
.sprockets清单-.json
应用程序-.js
应用程序-.css
打开。链轮清单。。。文件,您应该会看到应用程序js和css文件的文件名与实际的public/assets/文件匹配。当Rails标记被替换时,这个.sprockets清单文件控制HTML头链接和脚本中实际包含的内容
如果这仍然不起作用,请确保运行测试(包括清单)的用户可以访问这些文件。在复制文件和源代码管理中,有时会丢失.sprockets清单文件,因为它可能看起来是隐藏的
最后,检查您的文件log/test.log,查看在测试期间是否有任何明显的错误抛出。修改
样式表链接标签不是一个好的解决方案,更好的解决方案是指定Capybara.asset\u host
,它将向任何保存的页面添加
标签。通常,这将设置为
Capybara.asset_host = "http://localhost:3000/"
然后从dev服务器加载JS/CSS资产,dev服务器可以访问公共子目录中的测试模式编译资产。注意:这一切都不意味着页面将真正起作用,因为JS请求仍将失败,DB记录将不再存在,等等。此外,由于它保存元素属性(而不是属性),您刚才选中的复选框可能不会在保存的页面中被选中。然而,它会给你一个通用样式的页面,你可以检查它的结构。如果你所要查找的只是页面的当前图像,那么你应该使用大多数水豚驱动程序提供的save\u屏幕截图
/save\u和\u open\u屏幕截图
功能。你在rake资产:预编译
之前是否尝试过rake资产:clobber
,以确保你拥有一套完全干净的页面资产?是的。这是一个全新的演示项目。我担心的是,你的链接标签引用的是空文件<代码>rake资产:clobber
将在尝试预编译之前清除已就位的资产。然后,预编译应该返回生成的文件列表。另外,link标签应该具有指向新js和css文件的href属性。包含layout.html.erb文件中显示页面和链接标记的几行可能会很有用。谢谢,我试过了,效果不错。我只是把Capybara.asset\u主机=”http://localhost:3000/“
insidespec\rails\u helper.rb
就是这样。这个解决方案确实更好。@prograils不客气,如果这是最好的答案,请将这个答案标记为已接受(复选标记),这样你的问题就会被标记为已回答。对不起,但是你的解决方案突然停止工作了。我不明白我改变了什么。无论如何,它是如何工作的-http://localhost:3000/
只有在服务器正在运行时才能工作,而不是在我调用保存并打开页面之后,对吗?即使将Capybara.asset\u hos
t设置为“file://{::Rails.root}/public”
也没有帮助。@prograils正如我在回答中所说的,它将从开发服务器实例(而不是测试服务器实例)加载它们,大多数人通常在大多数时间(使用Rails
dev默认值时)都会让它们运行
save_and_open_page
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
rake assets:clobber
rake assets:precompile
.sprockets-manifest-<xyz>.json
application-<abc>.js
application-<def>.css
Capybara.asset_host = "http://localhost:3000/"