Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 带CSS和JS的水豚RSpec? 轨道(5.1.4) rspec钢轨(3.7.2) 水豚(2.16.1)_Ruby On Rails_Capybara_Rspec Rails - Fatal编程技术网

Ruby on rails 带CSS和JS的水豚RSpec? 轨道(5.1.4) rspec钢轨(3.7.2) 水豚(2.16.1)

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调

我正在尝试创建一个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
调用(在浏览器中)之后,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
和rake
assets: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/“
    inside
    spec\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/"