params在测试Rails辅助方法时设置哈希值?我想设置params[:search] = 'my keyword search'在我的帮助方法中使用,然后从it示例块中调用它.
require 'rails_helper'
describe BooksHelper do
describe "#page_title_helper" do
let(:params) { {search: 'my keyword search'} }
it "should read the params hash" do
expect(helper.params[:search]).to eq "my keyword search"
end
end
end
Run Code Online (Sandbox Code Playgroud)
BooksHelper
def title_helper
if params[:search]
"Books related to #{params[:search]}"
else
"All Books"
end
end
end
Run Code Online (Sandbox Code Playgroud) 我有一个rake任务,根据环境防范危险的Rails rake rasks.它工作正常.当我在RSpec中测试每个单独的危险方法时,测试通过.当我连续测试多个时,对于多个环境,测试在第一个测试后失败.例如,即使我为同一危险动作多次运行测试rake db:setup,它也只会在第一次通过.如果我将测试作为单独的it语句运行,每个危险操作一个,只有前两个将通过(有4个).
如何在这里使RSpec正常运行,并在套件中运行时通过所有测试?
耙子任务
# guard_dangerous_tasks.rake
class InvalidTaskError < StandardError; end
task :guard_dangerous_tasks => :environment do
unless Rails.env == 'development'
raise InvalidTaskError
end
end
%w[ db:setup db:reset ].each do |task|
Rake::Task[task].enhance ['guard_dangerous_tasks']
end
Run Code Online (Sandbox Code Playgroud)
RSpec测试
require 'spec_helper'
require 'rake'
load 'Rakefile'
describe 'dangerous_tasks' do
context 'given a production environment' do
it 'prevents dangerous tasks' do
allow(Rails).to receive(:env).and_return('production')
%w[ db:setup db:reset ].each do |task_name|
expect { Rake::Task[task_name].invoke }.to raise_error(InvalidTaskError)
end
end
end
context 'given a test …Run Code Online (Sandbox Code Playgroud) 任何一个可以请解释一下我一下的区别be_true,并be true用简单的例子红宝石英寸 我也见过be_true并且be_false改为be_truthy和be_falsey
我有一个'be true'工作的例子,但当我尝试使用'be_true'或'be_truthy'规格失败.
我使用的是RSpec 3.1.7版
由于我更新了我的Gemfile并转移到rspec 3,在许多测试中,我收到错误:way:
it "should reject attribute that are too short" do
short = "a" * 3
hash = @attr.merge(:details => short)
Deal.new(hash).should have(1).error_on(:details)
end
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
Failure/Error: Deal.new(hash).should have(1).error_on(:details)
NoMethodError:
undefined method `have' for #<RSpec::ExampleGroups::Deal_2::TestsOnDealsModelsValidations>
Run Code Online (Sandbox Code Playgroud)
我读过我现在应该使用"expect"而不是应该但是have(1).error_on,我应该如何编写它以符合rspec 3?
我尝试了以下但它仍然无法正常工作:
it "should reject attribute that are too short" do
short = "a" * 3
hash = @attr.merge(:details => short)
expect(Deal.new(hash).error_on(:details).size).to eq(1)
end
Run Code Online (Sandbox Code Playgroud) it 'should be an array and not be empty' do
pending
expect(a.class).to be(Array)
expect(a.empty?).to be(false)
expect(a.first.class).to be(ExampleClass)
end
Run Code Online (Sandbox Code Playgroud)
当我运行rspec时:
Failures:
1) should be an array and not be empty FIXED
Expected pending 'No reason given' to fail. No Error was raised.
# ./spec/example_spec.rb:19
Run Code Online (Sandbox Code Playgroud)
任何想法为什么这被列为失败?
我有一个organization具有属性的对象name, doing_business_as.我需要验证它name是不一样的doing_business_as.
# app/models/organization.rb
class Organization < ActiveRecord::Base
validate :name_different_from_doing_business_as
def name_different_from_doing_business_as
if name == doing_business_as
errors.add(:doing_business_as, "cannot be same as organization name")
end
end
end
Run Code Online (Sandbox Code Playgroud)
我有一个匹配的rspec文件来验证这个:
# spec/models/organization_spec.rb
require "rails_helper"
describe Organization do
it "does not allow NAME and DOING_BUSINESS_AS to be the same" do
organization = build(:organization, name: "same-name", doing_business_as: "same-name")
expect(organization.errors[:doing_business_as].size).to eq(1)
end
end
Run Code Online (Sandbox Code Playgroud)
然而,当我运行规范时,它失败了,这就是我得到的:
$ rspec spec/models/organization_spec.rb
Organization
does not allow NAME and DOING_BUSINESS_AS to be …Run Code Online (Sandbox Code Playgroud) 我可以测试参数是否传递如下:
RSpec.describe do
it do
obj = double
expect(obj).to receive(:method).with(1, 2, 3)
obj.method(1, 2, 3)
end
end
Run Code Online (Sandbox Code Playgroud)
我该怎么做一个块参数?我的理想代码:
RSpec.describe do
it do
obj = double
proc = Proc.new{}
expect(obj).to receive(:method).with(1, 2, 3).with_block(proc)
obj.method(1, 2, 3, &proc)
end
end
Run Code Online (Sandbox Code Playgroud) 我在应用程序配置中定义了一个选项.我要测试的类是在gem中定义的(不是由我编写的).我想重新开课:
Myclass.class_eval do
if Rails.application.config.myoption=='value1'
# some code
def self.method1
end
else
# another code
def self.method2
end
end
end
Run Code Online (Sandbox Code Playgroud)
我想使用RSpec 3测试此代码:
# myclass_spec.rb
require "rails_helper"
RSpec.describe "My class" do
allow(Rails.application.config).to receive(:myoption).and_return('value1')
context 'in taxon' do
it 'something' do
expect(Myclass).to respond_to(:method1)
end
end
end
Run Code Online (Sandbox Code Playgroud)
如何在运行重新打开类的代码之前存根应用程序配置值.
Serverspec站点的"高级提示"部分显示了使用相同测试集测试多个主机的示例.我已经建立了一个我自己的例子(https://gist.github.com/neilhwatson/81249ad393800a76a8ad),但是有问题.
第一个问题是测试在第一次失败时停止,而不是继续通过该批次并保持计数.第二个是故障输出并不表示故障发生在哪个主机上.我该怎么做才能解决这些问题并为所有主机生成最终报告?
我正在创造
bundler gem --test=rspec MyGem.
Run Code Online (Sandbox Code Playgroud)
我正在获取存储库结构.
当我尝试运行rspec代码时,我收到以下错误:
`require': cannot load such file -- spec_helper (LoadError)
Run Code Online (Sandbox Code Playgroud)
然后我尝试应用require relative但我仍然收到错误:
sheetal@ubuntu:~/sheetal/spec$ rspec sheetal_spec.rb
\/home/sheetal/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- spec_helper (LoadError)
from /home/sheetal/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /home/sheetal/sheetal/spec/sheetal_spec.rb:1:in `<top (required)>'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `block in load_spec_files'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `each'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load_spec_files'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:96:in `setup'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:84:in `run'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:69:in `run'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/lib/rspec/core/runner.rb:37:in `invoke'
from /home/sheetal/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.1.7/exe/rspec:4:in `<top (required)>'
from /home/sheetal/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `load'
from /home/sheetal/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `<main>'
from /home/sheetal/.rvm/gems/ruby-2.2.0/bin/ruby_executable_hooks:15:in `eval'
from /home/sheetal/.rvm/gems/ruby-2.2.0/bin/ruby_executable_hooks:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)