设置RSpec来测试gem(不是Rails)

Zar*_*doz 152 testing gem rubygems rspec rspec2

使用添加的rspec-rails生成器来设置RSpec以测试Rails应用程序非常容易.但是如何添加RSpec来测试开发中的宝石?我不是在使用珠宝商或这样的工具.我只是使用Bundler(bundle gem my_gem)来设置新gem的结构并手动编辑*.gemspec.我还加入s.add_development_dependency "rspec", ">= 2.0.0"了gemspec并做了一个bundle install.

是否有一些很好的教程,接下来要做什么让RSpec工作?

iai*_*ain 251

我已更新此答案以符合当前的最佳做法:

Bundler完美支持宝石开发.如果要创建gem,则Gemfile中唯一需要的是:

source "https://rubygems.org"
gemspec
Run Code Online (Sandbox Code Playgroud)

这告诉Bundler在运行时查看gemspec文件中的依赖项bundle install.

接下来,确保RSpec是gem的开发依赖项.编辑gemspec,使其显示为:

spec.add_development_dependency "rspec"
Run Code Online (Sandbox Code Playgroud)

接下来,创建spec/spec_helper.rb并添加以下内容:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

RSpec.configure do |config|
  # some (optional) config here
end
Run Code Online (Sandbox Code Playgroud)

前两行告诉Bundler只加载gemspec中的gem.当您在自己的计算机上安装自己的gem时,这将强制您的规范使用您当前的代码,而不是您单独安装的版本.

创建规范,例如spec/foobar_spec.rb:

require 'spec_helper'
describe Foobar do
  pending "write it"
end
Run Code Online (Sandbox Code Playgroud)

可选:.rspec为默认选项添加文件并将其放在gem的根路径中:

--color
--format documentation
Run Code Online (Sandbox Code Playgroud)

最后:运行规范:

$ rspec spec/foobar_spec.rb
Run Code Online (Sandbox Code Playgroud)

  • 公平地说,您应该调用RSpec的init命令来生成规范框架文件,而不必手动输入它们.这将确保与您正在使用的RSpec版本的兼容性:`rspec --init` (75认同)
  • 当我写这篇文章时,`rspec --init`不可用,但好点! (12认同)

Mir*_*ich 53

Iain的解决方案效果很好!

如果您还想要一个Rakefile,这就是您所需要的:

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

# If you want to make this the default task
task default: :spec
Run Code Online (Sandbox Code Playgroud)

检查RDoc for RakeTask以获取可以选择传递给任务定义的各种选项.


Ste*_*nez 26

您可以通过运行生成rspec的新gem bundler gem --test=rspec my_gem.没有额外的安装!

我总是忘记这一点.它在这里实现:https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


wul*_*one 6

这是一种便宜又简单(虽然不是官方推荐)的方式:

在你的宝石根中设一个dir spec,把你的规格放在那里.您可能已经安装了rspec,但如果不安装,只需执行操作即可gem install rspec忘记Gemfiles和bundler.

接下来,您将制作一个规范,您需要告诉它您的应用程序在哪里,文件所在的位置,并包含您要测试的文件(以及它具有的任何依赖项):

# spec/awesome_gem/awesome.rb
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
$: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
require 'some_file_in_the_above_dir' # this loads the class you want to test

describe AwesomeGem::Awesome do
  before do
    @dog = AwesomeGem::Awesome.new(name: 'woofer!')
  end
  it 'should have a name' do
    @dog.name.should eq 'woofer!'
  end
  context '#lick_things' do
    it 'should return the dog\'s name in a string' do
      @dog.lick_things.should include 'woofer!:'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

打开终端并运行rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures
Run Code Online (Sandbox Code Playgroud)

如果你想要一些.rspec喜欢的选项,那就去制作一个.rspec文件并把它放在你宝石的根路径中.我看起来像这样:

# .rspec
--format documentation --color --debug --fail-fast
Run Code Online (Sandbox Code Playgroud)

简单,快速,整洁!

我喜欢这个,因为你根本不需要为你的项目添加任何依赖项,整个事情仍然非常快. bundle exec减慢一些事情,这是你必须要做的,以确保你一直使用相同版本的rspec.运行两次测试所花费的0.56秒是我的计算机加载rspec时占用的99%.运行数百个规格应该非常快.您可能遇到的唯一问题是,如果您更改了rspec的版本,并且新版本不向后兼容您在测试中使用的某些功能,则可能需要重新编写一些测试.

如果您正在进行一次性规范或有一些很好的理由不在您的gemspec中包含rspec,这是很好的,但是它对于启用共享或强制执行兼容性并不是很好.