SimpleCov 报告使用 Spork 运行 RSpec 测试后未在 Rails 3 应用程序中生成

2023-11-23

我刚刚安装了简单冠状病毒gem 在我的 Rails 3.2.6 应用程序上生成代码覆盖率报告,它与 RSpec 配合得很好,但与 Spork 配合不好。我可以通过运行获得所需的正确报告rspec --no-drb spec/,但我也想让它们与 Spork 一起运行,只使用rspec spec/.

鉴于有人在这方面取得了成功,看来我的设置可能存在错误。我有仔细阅读设置说明以及GitHub问题据称可以为 Spork 用户提供修复,但仍然没有成功。我想知道是否有人可以提供他们工作的完整示例规范/spec_helper.rb我可以用作参考的文件,因为广泛的谷歌搜索只出现了片段。根据其他网站的建议,我尝试更改config.cache_classes in 配置/环境/test.rb从默认的true to false to !(ENV['DRB'] == 'true'),没有运气。

作为参考,这就是我的设置方式:

Gemfile

group :development, :test do
  # ...
  gem 'rspec-rails', '2.10.1'
end

group :test do
  # ...
  gem 'spork', '0.9.0'
  gem 'simplecov', '0.6.4', require: false
end

.spec

--colour
--drb

规范/spec_helper.rb(根据GitHub问题)

require 'simplecov'
SimpleCov.start 'rails'

require 'rubygems'
require 'spork'

Spork.prefork do
  unless ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
  end

  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_base_class_for_anonymous_controllers = false
  end
end

Spork.each_run do
  if ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
  end
end

我尝试过注释掉/更改前两个SimpleCov该文件的语句和里面的 Simplecov 语句Spork块,但似乎无法找到有效的组合。

我缺少什么?还有其他文件需要更改吗?


我设法找到了一份工作规范/spec_helper.rb只需使用以下命令即可正确执行 SimpleCov 的配置$ rspec spec/命令感谢对 Github 问题的评论那把我送到这个博客条目, and 它的例子规范/spec_helper.rb。所有原因why该作品包含在(非常详细!)博客条目中。代替SampleApp与您的应用程序的名称。

规范/spec_helper.rb

require 'rubygems'
require 'spork'

Spork.prefork do
  unless ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
  end

  require 'rails/application'
  require Rails.root.join("config/application")

  ENV["RAILS_ENV"] ||= 'test'
  require 'rspec/rails'
  require 'rspec/autorun'

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = false

    config.before :each do
      if Capybara.current_driver == :rack_test
        DatabaseCleaner.strategy = :transaction
      else
        DatabaseCleaner.strategy = :truncation
      end
      DatabaseCleaner.start
    end

    config.after do
      DatabaseCleaner.clean
    end

    config.infer_base_class_for_anonymous_controllers = false
  end
end

Spork.each_run do
  if ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
    SampleApp::Application.initialize!
    class SampleApp::Application
      def initialize!; end
    end
  end

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
end

Edit

如果你使用特拉维斯-CI,不要按原样使用此代码,因为您可能会得到undefined method 'root' for Rails:Module (NoMethodError)错误。如果您知道如何解决此问题,请分享。

Edit 2

我让 Travis CI 工作,基本上把所有东西都放在Spork.each_run块,这似乎显着减慢了测试速度。必须有更好的方法来做到这一点,或者为了不必运行而似乎不值得$ rspec --no-drb spec/一次获得 SimpleCov 报告...

规范/spec_helper.rb

require 'rubygems'
require 'spork'

Spork.prefork do
  unless ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
  end

  require 'rails/application'
  ENV["RAILS_ENV"] ||= 'test'
end

Spork.each_run do
  if ENV['DRB']
    require 'simplecov'
    SimpleCov.start 'rails'
    require Rails.root.join("config/application")
    SampleApp::Application.initialize!
    class SampleApp::Application
      def initialize!; end
    end
  end

  unless ENV['DRB']
    require File.expand_path("../../config/environment", __FILE__)
  end

  require 'rspec/rails'
  require 'rspec/autorun'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec

    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = false
    config.before :each do
      if Capybara.current_driver == :rack_test
        DatabaseCleaner.strategy = :transaction
      else
        DatabaseCleaner.strategy = :truncation
      end
      DatabaseCleaner.start
    end

    config.after do
      DatabaseCleaner.clean
    end
    config.infer_base_class_for_anonymous_controllers = false
  end
end

Edit 3

使用此配置几天后,它似乎并没有像我之前想象的那样减慢速度,所以我会认为这是可接受的答案,除非发布更优雅的答案。

Edit 4

使用这个配置几个月后,我开始意识到它is比我想象的要慢。部分原因是人们意识到 Spork 似乎可以减慢测试套件的速度,并且最适合快速迭代的集中测试,而不是总是用它运行整个测试套件。以下问题和博客文章让我了解到规范助手.rb下面的文件,无论有没有 Spork 都可以运行 SimpleCov,运行速度比以前更快,并且可以与 Capybara 2.0 配合使用。

  • 使用 spork 的 Rails 项目 - 总是必须使用 spork?
  • 如何使用 perftools 和捆绑器分析 RSpec?
  • Spork.trap_method 柔术
  • 当 Spork 在你的 Cucumber 上放一把叉子,在你的规格上放一把扳手
  • 调整你的规格
  • 分析 Spork 以加快启动时间
  • Sane RSpec 配置用于干净且稍快的规格

规范/spec_helper.rb

require 'rubygems'
require 'spork'
require 'simplecov'
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  unless ENV['DRB']
    SimpleCov.start 'rails'
    require File.expand_path("../../config/environment", __FILE__)
  end

  require 'rspec/rails'
  require 'rspec/autorun'
  require 'capybara/rails'
  require 'capybara/rspec'

  # files to preload based on results of Kernel override code below
  # ie they took more than 100 ms to load
  require "sprockets"
  require "sprockets/eco_template"
  require "sprockets/base"
  require "active_record/connection_adapters/postgresql_adapter"
  require "tzinfo"
  require "tilt"
  require "journey"
  require "journey/router"
  require "haml/template"

  RSpec.configure do |config|
    config.mock_with :rspec

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = false

    # If true, the base class of anonymous controllers will be inferred
    # automatically. This will be the default behavior in future versions of
    # rspec-rails.
    config.infer_base_class_for_anonymous_controllers = false

    config.include FactoryGirl::Syntax::Methods

    config.before :suite do
      # PerfTools::CpuProfiler.start("/tmp/rspec_profile")
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.clean_with(:truncation)
    end

    # Request specs cannot use a transaction because Capybara runs in a
    # separate thread with a different database connection.
    config.before type: :request do
      DatabaseCleaner.strategy = :truncation
    end

    # Reset so other non-request specs don't have to deal with slow truncation.
    config.after type: :request  do
      DatabaseCleaner.strategy = :transaction
    end

    RESERVED_IVARS = %w(@loaded_fixtures)
    last_gc_run = Time.now

    config.before(:each) do
      GC.disable
    end

    config.before do
      DatabaseCleaner.start
    end

    config.after do
      DatabaseCleaner.clean
    end

    # Release instance variables and trigger garbage collection
    # manually every second to make tests faster
    # http://blog.carbonfive.com/2011/02/02/crank-your-specs/
    config.after(:each) do
      (instance_variables - RESERVED_IVARS).each do |ivar|
        instance_variable_set(ivar, nil)
      end
      if Time.now - last_gc_run > 1.0
        GC.enable
        GC.start
        last_gc_run = Time.now
      end
    end

    config.after :suite do
      # PerfTools::CpuProfiler.stop

      # REPL to query ObjectSpace
      # http://blog.carbonfive.com/2011/02/02/crank-your-specs/
      # while true
      #   '> '.display
      #   begin
      #     puts eval($stdin.gets)
      #   rescue Exception => e
      #     puts e.message
      #   end
      # end
    end
  end

  # Find files to put into preload
  # http://www.opinionatedprogrammer.com/2011/02/profiling-spork-for-faster-start-up-time/
  # module Kernel
  #   def require_with_trace(*args)
  #     start = Time.now.to_f
  #     @indent ||= 0
  #     @indent += 2
  #     require_without_trace(*args)
  #     @indent -= 2
  #     Kernel::puts "#{' '*@indent}#{((Time.now.to_f - start)*1000).to_i} #{args[0]}"
  #   end
  #   alias_method_chain :require, :trace
  # end
end

Spork.each_run do
  # This code will be run each time you run your specs.
  if ENV['DRB']
    SimpleCov.start 'rails'
    SampleApp::Application.initialize!
    class SampleApp::Application
      def initialize!; end
    end
  end

  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
  FactoryGirl.reload
  I18n.backend.reload!
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SimpleCov 报告使用 Spork 运行 RSpec 测试后未在 Rails 3 应用程序中生成 的相关文章

  • 如何在.net core 2应用程序中获取代码覆盖率报告

    我是 dotnet core 2 0 的新手 不知道如何提取代码覆盖率报告 dotnet 测试命令 寻求社区的帮助 这是我用于生成 dotnet 核心的 bat 文件 这将 弹出 一个index htm 文件 这只是我在这里找到的 bat
  • Rspec——需要存根在另一个文件中调用的 File.open

    在我的测试中 我正在初始化一个名为的新类Package带有一些参数 在此类的初始化中 我打开一个在远程机器上可用的文件 但不是本地常见的文件 我想知道如何在测试中对该方法进行存根 我正在使用 rspec 和 mocha 我尝试过类似的东西
  • Rails 从视图中调用操作

    希望这里有一个简单的问题 但我似乎无法找到答案 刚刚开始使用 RoR 但之前来自 ASP MVC 我在渲染部分视图时遇到问题 其局部变量不一定与主视图的变量相关联 例如 对于一个博客 我试图渲染一个链接到存档的侧边栏 def sidebar
  • 为什么“jQuery-Rails”经常位于资产组之外

    为什么我经常看到gem jquery rails之外的 assets group group assets do gem sass rails gt 3 1 0 gem coffee rails gt 3 1 0 gem uglifier
  • 使用 kaminari 查找给定记录的页面

    Ruby on Rails 3 项目 更新记录后 我们返回所有记录的索引 不是更新记录的视图 该索引通过 Kaminari 进行分页 我们如何返回到包含更新记录的索引页面 Java JPA Hibernate 有类似的问答使用 JPA Hi
  • Rails - 动态构建深度嵌套对象(Cocoon /nested_form)

    我目前有一个具有深层嵌套的复杂形式 并且我正在使用Cocoon https github com nathanvda cocoongem 根据需要动态添加部分 例如 如果用户想要在销售表单中添加另一辆车 代码如下所示 div class a
  • 如何设置“attr_accessible”以便不允许使用 Ruby on Rails 访问模型的任何字段?

    如果在模型文件中我只有以下代码 class Users lt ActiveRecord Base end 这意味着什么 与模型相关的所有属性是否均可访问 我如何设置 attr accessible 以便not允许访问any领域的for那个型
  • Rails 3.0.0.beta 和 Facebooker:还有其他人看到以下内容吗?

    我的 Rails 服务器在安装 facebooker 插件后似乎崩溃了 任何有关解决此问题的建议都会很棒 我正在使用 Rails 3 0 0 beta 和 facebooker 以下是我看到的步骤和错误 rails v Rails 3 0
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • Rails 3 Mechanize - SocketError:getaddrinfo:主机或名称未知

    我正在使用 mechanize 但出现此错误 有人可以帮帮我吗 我已将元刷新设置为 true 错误日志 SocketError getaddrinfo Host or name not known form C Ruby192 lib ru
  • ActiveRecord:向包含的 ON 子句添加条件

    我有一个模型报价和另一个历史报价 一个报价有很多历史报价 现在 我想立即加载一组报价的某一天的历史报价 如果存在 为此 我认为我需要将这一天传递给 ON 子句 而不是 WHERE 子句 以便我获得所有报价 即使在给定日期没有历史报价时也是如
  • Rails 3.1 和图像资源

    我已将管理主题的所有图像放入名为 admin 的文件夹内的资产文件夹中 然后我像平常一样链接到它 Ruby image tag admin file jpg CSS logo background url assets images adm
  • Rails 4 的 mobile_fu

    我正在尝试将我的应用程序从 Rails 3 2 13 切换到 Rails 4 在此过程中 我遇到了一个主要障碍 我使用 gem mobile fu 来确定用户是否来自移动设备 该 gem 需要 Railties 3 2 13 但 Rails
  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • Rails - 用于集合集的单选按钮

    我有以下输出选择框 br 替代输出单选按钮的 Rails 方法是什么 对于单选按钮 您必须自行迭代并输出每个单选按钮及其标签 事实上这真的很容易
  • 再次返回使用 Rails 3 中的 Rails 2.3.5

    最近 我看到有关Rails 3 0 beta的信息 我想尝试一下 所以我使用gem update并安装了这个版本 但现在 我需要回到 Rails 2 3 5 我怎样才能做到呢 我正在考虑这两个解决方案 卸载 Rails 3 我读到有人使用
  • 如何使用 RSpec 3.4 在视图规范中存根控制器辅助方法?

    我正在测试一个视图RSpec 3 4 上Rails4 2 5 我用的是体面的曝光我的 CRUD 控制器中的 gem 体面的曝光可以轻松定义可用于我的视图并记住结果值的命名方法 但我不明白如何在视图规范中存根这些方法 我尝试根据 RSpec
  • 通过 SSL 发布 UTF-8 时,HEROKU 上出现“EOFError:已到达文件结尾”

    我在 heroku 上遇到了奇怪的错误 为了重现它 我必须使用请求正文中的任何 UTF 8 字符制作大的 超过几 KB HTTPS POST 这是一个例子 require net https require uri Accutally I
  • 子域中的 Rails url 助手 - 删除子域

    我网站上的用户可以拥有子域 例如 他们的页面网址是 name example com 登录的用户可以查看更多用户信息 因此在用户的显示页面上 我有一个使用以下代码生成的链接 user url user subdomain gt false
  • 查找 Rails 应用程序中未使用的代码

    如何查找正在运行和未运行的代码生产中 该应用程序经过充分测试 但还有很多测试unused代码 因此 他们在运行测试时得到覆盖 我想重构并清理这个烂摊子 它一直在浪费我的时间 我有很多后台工作 这就是为什么我希望生产环境来指导我 在 Hero

随机推荐

  • cx_Freeze 导致 Python 3.7.0 崩溃

    cx Freeze 6 0b1 最新版本 是否支持 Python 3 7 0 我刚刚创建了一个简单的项目 它适用于 Python 3 5 4 但不适用于 Python 3 7 0 它显示 Python 致命错误 initfsencoding
  • TestNG 可以看到我的 Spock (JUnit) 测试结果吗?

    需要让 TestNG 来运行我的 Spock 测试 因为 TestNG 在系统的其余部分中使用 由于 TestNG 支持运行 JUnit 测试 我尝试了以下方法
  • 如何调试“安全句柄已关闭”错误

    我继承的代码不断崩溃 并出现以下错误 根本没有改变 System ObjectDisposedException Safe handle has been closed at Microsoft Win32 UnsafeNativeMeth
  • Spring bean 范围。单例和原型

    假设有两个类ClassA和ClassB 假设 ClassB 依赖于 ClassA 在配置文件中 如果我们将 ClassA 的范围定义为单例 将 ClassB 的范围定义为 Prototype 那么每次创建 ClassA 的 bean 实例时
  • ES2021 (ES12) 中的 WeakRef 和终结器是什么

    我想了解什么是WeakRef和终结器ES2021 with a 真正的简单例子 and Where使用它们 I know WeakRef是一个类 这将允许开发人员创建对对象的弱引用 而终结器或FinalizationRegistry允许您注
  • Django 使用 Allauth 进行其余身份验证

    我已经用 Allauth 实现了 django Rest auth 如果我通过 google 登录 它工作正常access token但有一种情况 某些客户端设备需要通过谷歌登录id token 如果我使用 我会收到错误id token代替
  • 改造:如何在没有内容编码的情况下解析 GZIP 响应:gzip 标头

    我正在尝试处理 GZIP 的服务器响应 响应带有标头 Content Type application x gzip 但没有标题 Content Encoding gzip 如果我使用代理添加该标头 响应就会被很好地解析 我对服务器没有任何
  • 使用 JS 更改 svg 元素的位置

    尝试制作一个在按下按钮时移动的 svg 矩形 现在我只想通过函数修改 x function modX document getElementById rectangle transform translate 295 115 var x 2
  • 进程间通信建议[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一种轻量级 快速且简单的方法来处理 Linux 计算机上某些程序之间的进程间通信 目前 我正在考虑命名管道 因为它是由操作系统本身提供的 关于性能或可用性有什么注意事项吗
  • 汇编语言 - 如何进行取模?

    x86 汇编中是否有类似模运算符或指令之类的东西 如果您的模数 除数是已知常数 并且您关心性能 请参阅this and this 对于直到运行时才知道的循环不变值 乘法逆甚至是可能的 例如看https libdivide com 但是如果没
  • 展开 折叠 展开 JTree 延迟加载的问题

    我已经使用延迟加载实现了一棵树 第一级节点是在创建树时创建的 而子节点仅在用户展开任何特定节点时创建 数据来自数据库 我们向数据库发出查询以填充子节点 实现了 TreeExpansionListener 并使用 treeExpanded 方
  • boost asio异步等待条件变量

    是否可以对 boost asio 中的条件变量执行异步等待 读取 非阻塞 如果不直接支持任何有关实现的提示 我们将不胜感激 我可以实现一个计时器 甚至每隔几毫秒就触发一次唤醒 但这种方法要差得多 我发现很难相信条件变量同步没有实现 记录 如
  • 正确地将 DateTime 从 C# 插入到 mongodb

    我尝试在 MongoDB 中插入当地时间 var time DateTime Now 03 05 2014 18 30 30 var query new QueryDocument time nowTime collection3 Inse
  • 为什么要使用 urlencode?

    我正在编写一个 Web 应用程序并学习如何对 html 链接进行 urlencode 这里的所有 urlencode 问题 参见下面的标签 都是 如何 问题 我的问题不是 如何 但为什么 即使维基百科的文章也只讨论了它的机制 http en
  • 移动 NumPy 数组中的所有索引

    我有一个像这样的 numpy 数组 x np array 0 1 2 3 4 想要创建一个数组 其中索引 0 中的值位于索引 1 中 索引 1 中的值位于索引 2 中 依此类推 我想要的输出是 y np array 0 0 1 2 3 我猜
  • 在命令行中制作java包

    虽然它可能是推荐使用的 IDE 来编码高级 java 项目 但我个人更喜欢几乎完全运行命令行 使用 gedit 作为文本编辑器 所以请不要只是告诉我 就用 eclipse 吧 或其他什么 P 我的问题是在java中通过命令创建包的方法是什么
  • 使用 group by 进行 SQL 连接的 HQL 版本

    我有两张表 Band 和 Votes Band 有一个名称和一个 id Votes 有一个 Total votes 列和一个名为 band id 的外键 该外键指向 band id 我有很多选票 在不同日期保存 我想要做的是找到每个频段的
  • 如何使用 readline 支持重新安装 ruby​​?

    我已经按照 RVM 的说明安装了 Rubyhttps github com wayneeseguin rvm installation 作为信息 我有所有档案 readline 5 2 tar gz readline 6 2 tar gz
  • 在 java eclipse 控制台中更改颜色

    有没有办法改变eclipse控制台中的文本颜色 我不是在谈论当我进入选项并将颜色从黑色更改为红色时 我的意思是 就像当我启动程序并执行代码时 它会在某个时刻改变颜色 例如 code if a 2 change text color to r
  • SimpleCov 报告使用 Spork 运行 RSpec 测试后未在 Rails 3 应用程序中生成

    我刚刚安装了简单冠状病毒gem 在我的 Rails 3 2 6 应用程序上生成代码覆盖率报告 它与 RSpec 配合得很好 但与 Spork 配合不好 我可以通过运行获得所需的正确报告rspec no drb spec 但我也想让它们与 S