【问题标题】:Missing mutant-rspec?缺少突变体-rspec?
【发布时间】:2017-01-18 11:25:11
【问题描述】:

我正在尝试使用来自存储库的 ruby 2.1.5+deb8u2ruby-dev 2.1.5+deb8u2 包在新安装的 Debian 8.5 上设置一个新的 Ruby 项目。我想在我的项目中包括突变测试。我添加了mutant-rspec 到我的Gemfile

source 'https://rubygems.org'

gem 'rake'
gem 'rspec', require: 'spec'
gem 'mutant-rspec'

Bundler (1.13.0) 似乎可以很好地安装 gem

ytg@debian-vm:~/projects/new_project$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/.
Using rake 11.2.2
....
Using rspec-core 3.5.3
Using rspec-expectations 3.5.0
Using rspec-mocks 3.5.0
...
Using rspec 3.5.0
...
Installing mutant 0.8.11
Installing mutant-rspec 0.8.11
Bundle complete! 5 Gemfile dependencies, 34 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

现在如果我尝试运行mutant,使用rake mutant --trace 和rake 文件

require 'bundler/gem_tasks'
require 'rspec/core/rake_task'
require 'rubocop/rake_task'
require 'mutant'

RSpec::Core::RakeTask.new :spec

task default: :spec

RuboCop::RakeTask.new

task :mutant do
  result = Mutant::CLI.run %w(--since problem9 -Ilib -Ispec
                              --use rspec MyProject*)
  raise 'Mutation testing failed' unless result
end

我收到一条错误消息:

warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.8-compliant syntax, but you are running 2.1.5.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
** Invoke mutant (first_time)
** Execute mutant
Could not load integration "rspec" (you may want to try installing the gem mutant-rspec)
rake aborted!
Mutation testing failed
/home/ytg/projects/new_project/Rakefile:15:in `block in <top (required)>'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:248:in `call'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:248:in `block in execute'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:243:in `each'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:243:in `execute'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/usr/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:180:in `invoke_with_call_chain'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/task.rb:173:in `invoke'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:152:in `invoke_task'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `block (2 levels) in top_level'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `each'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `block in top_level'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:117:in `run_with_threads'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:102:in `top_level'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:80:in `block in run'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:178:in `standard_exception_handling'
/var/lib/gems/2.1.0/gems/rake-11.2.2/lib/rake/application.rb:77:in `run'
/var/lib/gems/2.1.0/gems/rake-11.2.2/exe/rake:27:in `<top (required)>'
/usr/local/bin/rake:23:in `load'
/usr/local/bin/rake:23:in `<main>'
Tasks: TOP => mutant

如果我尝试直接执行,则会出现相同的消息

ytg@debian-vm:~/projects/new_project$ mutant -I lib/ --use rspec MyProject*
warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.8-compliant syntax, but you are running 2.1.5.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Could not load integration "rspec" (you may want to try installing the gem mutant-rspec)

据我了解,这是因为some loading issue。但究竟是什么加载问题?如何在我的项目上运行 mutant

(我也尝试使用sudo gem install mutant-rspec 安装gem,以防万一,但没有帮助,我收到相同的错误消息。)

【问题讨论】:

  • 您是否尝试解决有关 2.1.5 ABI 的警告?
  • 据我了解: 1. Ruby MRI Parser 无法兼容 2. parser 只有在成功启动后才能被mutant 用于实际分析我的 rb 文件。所以我想这应该不是问题。
  • 现阶段可能不会有问题,但这是目前唯一的线索,您可能希望最终解决这个问题。无论如何,这是您的 ruby​​ 开发环境的问题,但我不太了解您如何设置它来帮助解决问题。
  • 我添加了一些关于环境的信息,否则我到处使用默认值,我没有在这个地方乱搞。 (而且我宁愿不这样做,我更像是一个 Java 人。)

标签: ruby rspec rubygems rake bundler


【解决方案1】:

您正在运行的mutant 可能未在正确的环境中执行。请改用bundle exec mutant,这将确保您的Gemfile 中指定的那个与正确的一组宝石一起使用。

为了帮助调试,请使用which mutant 来确定正在调用哪个版本。 sudo gem install 应该不是解决方案,我建议sudo gem uninstall 恢复到原来的位置,否则以后可能会出现问题。

但我认为所有这些都是红鲱鱼。

对于您的Rakefile,它实际上并不是针对mutant 脚本。你绕过它直接去Mutant::CLI。这里的问题是没有设置加载路径以使其包含mutant-rspec

task :mutant do
  puts $LOAD_PATH # debug: see it's missing load path for mutant-rspec
  require 'bundler/setup' # This line is new
  puts $LOAD_PATH # debug: see how it changes

  result = Mutant::CLI.run %w(--since problem9 -Ilib -Ispec
                              --use rspec MyProject*)
  raise 'Mutation testing failed' unless result
end

或者,bundle exec rake mutant 也应该做同样的事情。我建议始终使用bundle exec(或binstubs),而不是使用rake 碰巧在您的路径上。否则很难推理。

【讨论】:

  • 卸载所有 gem 后,使用 bundler 安装所有东西...bundle exec 似乎可以解决问题。现在的问题是如何让我的 rake 目标使用 bundle 的突变体 (/var/lib/gems/2.1.0/gems/mutant-0.8.11/) 而不是其他突变体 (/usr/local/bin/mutant)?这个另一个变种人到底是什么?
  • 您能否编辑您的问题以包含您的Rakefile 定义?对于您的第二个问题,请尝试 dlocate /usr/local/bin/mutant 以查看它是否是由软件包安装的。否则,cat /usr/local/bin/mutant 看看这是否给你任何线索(也许通过gem install 安装在那里?)。
  • 将 Rakefile 编辑到问题中。 dlocate 没有给出任何结果。 cat 显示 # This file was generated by RubyGems. 似乎是一些用于加载实际突变宝石的 ruby​​gems 逻辑。
  • 编辑过的答案,可以解决吗?也不需要解决问题,但尝试使用常规的 gem uninstall mutant 来摆脱 /usr/local 的问题。
  • 你的线路确实为我修好了。非常感谢。 $LOAD_PATH 同时发生了变化。 Matcher 字段显示了从 rake 运行时的整个加载路径,但我想我可以接受。卸载 gem 确实摆脱了“其他”突变体,但捆绑器也停止看到它,所以它摆脱了我系统上的所有突变体。 (或者只是一个和它的海市蜃楼。)无论如何,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2018-09-22
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多