标签: rspec3

RSpec控制器规范不工作,除非明确添加:type =>:controller

我正在尝试运行该$ rspec命令但是我的所有控制器测试都失败了,除非我明确地添加:type => :controller到每个规范中.

这是我得到的错误:

1) AccountsController GET index assigns all accounts as @accounts
     Failure/Error: get :index, {}, valid_session
     NoMethodError:
       undefined method `get' for #<RSpec::ExampleGroups::AccountsController_2::GETIndex:0x007fd96c8a6a68>
     # ./spec/controllers/accounts_controller_spec.rb:36:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

这是生成的规范:

require 'spec_helper'

# This spec was generated by rspec-rails when you ran the scaffold generator.
# It demonstrates how one might use RSpec to specify the controller code that
# was generated by Rails when you ran the scaffold generator.
#
# …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails rspec-rails ruby-on-rails-4 rspec3

5
推荐指数
1
解决办法
1862
查看次数

nil的未定义方法`env':NilClass

我将rspec从版本2升级到3.之后我遇到了这个问题:

Failures:

  1) AlbumsController GET #edit 
     Failure/Error: sign_in_and_switch_schema @user
     NoMethodError:
       undefined method `env' for nil:NilClass
     # ./spec/support/auth_helpers.rb:10:in `sign_in_and_switch_schema'
     # ./spec/controllers/albums_controller_spec.rb:12:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

spec_helper.rb包含:

 RSpec.configure do |config|
    # most omitted
    config.include Warden::Test::Helpers
    config.include Devise::TestHelpers, type: :controller
 end
Run Code Online (Sandbox Code Playgroud)

albums_controller_spec.rb:

describe AlbumsController do

  let(:album) { create(:album) }

  before(:all) do
    @user = create :user
  end

  before(:each) do
    sign_in_and_switch_schema @user
  end

  after(:all) do
    destroy_users_schema @user
    destroy_user @user
  end

 # describe's part omitted
end
Run Code Online (Sandbox Code Playgroud)

auth_helpers.rb发生错误的部分:

def sign_in_and_switch_schema(user)
 # binding.pry …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails devise rspec3

5
推荐指数
1
解决办法
4424
查看次数

通过用rails 4和rspec 3的verify_partial_doubles绊倒

我正在使用authlogic进行用户身份验证,在ApplicationController中,我定义了“ current_user”,“ current_user_session”等并将其设置为helper_methods。

对于我的主要索引,我有一个非常简单的视图规格:

RSpec.describe "main/index.html.erb", :type => :view do
  context "when not logged in" do

    before do
      allow(view).to receive(:current_user).and_return(nil)
    end

    it "has an h1" do
      render
      expect(rendered).to include('h1')
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,如果在我的配置中“ mocks.verify_partial_doubles = true”,那么在转储整个对象然后在底部说时,这将引起巨大的错误:

  1) main/index.html.erb when not logged in has an h1
     Failure/Error: allow(view).to receive(:current_user).and_return(nil)
       #<#<Class:0x00000104c249d0>:.........
       @rendered_views={}>> does not implement: current_user
Run Code Online (Sandbox Code Playgroud)

当然,建议将verify_partial_doubles设置为true,但是这样做会中断。我直接从文档中提取了以下内容:

https://www.relishapp.com/rspec/rspec-rails/v/3-1/docs/view-specs/view-spec#passing-view-spec-that-stubs-a-helper-method

如果该方法出现在ApplicationHelper中,它将起作用。但是,如果它在ApplicationController中并定义为helper_method,那么就没有这种运气了:

helper_method :current_user, ...

def current_user
  return @current_user if defined?(@current_user)
  @current_user = current_user_session && current_user_session.record
end
Run Code Online (Sandbox Code Playgroud)

我想要verify_partial_doubles提供的保护,如何解决此问题?

mocking authlogic ruby-on-rails-4 rspec3

5
推荐指数
1
解决办法
801
查看次数

如何计算RSpec示例过滤:焦点在git钩子?

我正在尝试编写一个Git预提交钩子,如果有一个标记的示例,它将不允许用户提交:focus.

使用RSpec的API(好吧即使它是私有的),有没有办法找出:focus过滤器的例子数量?

我找到了example_count-instance_method.它可能很有用,但我不确定如何从外部脚本调用它.

ruby git rspec rspec3

5
推荐指数
1
解决办法
267
查看次数

Rspec 允许和期望具有不同参数的相同方法

我想测试我在其中运行两次 Temp::Service.run 方法的方法:

module Temp
  class Service

    def self.do_job
      # first call step 1
      run("step1", {"arg1"=> "v1", "arg2"=>"v2"})


      # second call step 2
      run("step2", {"arg3"=> "v3"})


    end

    def self.run(name, p)
      # do smth

      return true
    end


  end
end
Run Code Online (Sandbox Code Playgroud)

我想测试提供给方法的第二次调用的参数:使用第一个参数“step2”运行,而我想忽略相同方法的第一次调用:运行但使用第一个参数“step1”。

我有 RSpec 测试

RSpec.describe "My spec", :type => :request do

  describe 'method' do
    it 'should call' do

      # skip this
      allow(Temp::Service).to receive(:run).with('step1', anything).and_return(true)

      # check this
      expect(Temp::Service).to receive(:run) do |name, p|
        expect(name).to eq 'step2'

        # check p
        expect(p['arg3']).not_to be_nil

      end


      # …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rspec3

5
推荐指数
1
解决办法
4550
查看次数

如何修复版本2.99的RSpec语法?

我最近将我的Rails 4应用程序从RSpec 2.X升级到2.99,尽管已经运行了Transpec,但我的一些测试仍然失败.

require 'spec_helper'

describe Invoice, :type => :model do

  before :each do
    @user = FactoryGirl.create(:user)
    @invoice = FactoryGirl.create(:invoice, :user => @user)
  end

  it "is not open" do
    expect {
      FactoryGirl.create(:payment, :invoice => @invoice, :amount => 100)  
    }.to change{@invoice.reload.open?}.from(true).to(false)
  end

  it "is open" do
    expect {
      FactoryGirl.create(:payment, :invoice => @invoice, :amount => 99.99)  
    }.to_not change{@invoice.reload.open?}.to(false)
  end

end
Run Code Online (Sandbox Code Playgroud)

第一次测试就像RSpec升级之前一样.

但是,第二个测试会抛出错误:

Failure/Error: expect {
   `expect { }.not_to change { }.to()` is deprecated.
Run Code Online (Sandbox Code Playgroud)

我必须将语法更改为什么?

我已经尝试了几件事not_to,be_falsey等等.到目前为止,没有任何工作.

谢谢你的帮助.

ruby rspec ruby-on-rails rspec-rails rspec3

4
推荐指数
1
解决办法
504
查看次数

RSpec - 无法存根类私有方法

我试图使用RSpec 3来创建一个外部请求某些JSON的方法.我之前将它放在spec_helper.rb文件中,但是现在我重构并将方法移动到它自己的类中,不再存根作品.

RSpec.configure do |config|
  config.before do
    allow(Module::Klass).to receive(:request_url) do
      JSON.parse(File.read(File.expand_path('spec/fixtures/example_data.json')))
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这个班看起来像这样

module Module
  class Klass

    # public methods calling `request_url`
    ...

    private

    def request_url(url, header = {})
      request = HTTPI::Request.new
      request.url = url
      request.headers = header

      JSON.parse(HTTPI.get(request).body)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

尽管保持spec_helper.rb相同并试图将存根放在实际规范之前,但仍在进行外部请求.

ruby rspec rspec3

4
推荐指数
1
解决办法
5746
查看次数

如何获得为特定模型类定义的所有factory_girl工厂?

我在中定义了一个工厂<Rails-root>/spec/factories/models.rb

FactoryGirl.define do
  factory :model do
    id 1
    association :organization, factory: :aureso
    name "Default Model"

    factory :serie_1 do
      id 2
      name 'serie_1'
    end

    factory :serie_2 do
      id 3
      name 'serie_2'
    end

    factory :serie_3 do
      id 4
      name 'serie_3'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想获得所有为Class定义的工厂Model

我可以使用来获得所有类的工厂定义FactoryGirl.factories,是的,我可以使用map / reduce实现上述目标。但是我想知道是否有任何辅助方法来获取模型类的所有定义。

ruby ruby-on-rails ruby-on-rails-4 rspec3 factory-bot

4
推荐指数
1
解决办法
1376
查看次数

返回值的RSpec序列和存根中引发的错误

我希望在引发异常的情况下先发出两次对HTTParty的调用,然后第三次调用应该返回值.

   before do
          allow(HTTParty).to receive(:get).exactly(2).times.with(url).and_raise(HTTParty::Error)
          allow(HTTParty).to receive(:get).with(url).and_return('{}')
        end
Run Code Online (Sandbox Code Playgroud)

但是一个允许覆盖另一个.如何设置存根以在前几次尝试中引发错误然后让它返回一个值?

ruby testing rspec ruby-on-rails rspec3

4
推荐指数
2
解决办法
1218
查看次数

RSpec 3.5 将参数传递给 shared_context

我有这个代码,我想在几个规范中重用:

RSpec.shared_context "a UserWorker" do |user|

  let(:mock_context_user) {{
    id: 1,
    brand: user.brand,
    backend_token: user.backend_token
  }}

  before(:each) do
    allow(SomeClass).to receive(:some_method)
      .with(user.id).and_return(mock_context_user)
  end

  before(:each, context: true) do
    Sidekiq::Testing.inline!
  end

  after(:each, context: true) do
    Sidekiq::Testing.fake!
  end

end
Run Code Online (Sandbox Code Playgroud)

在使用共享代码的规范文件中:

let(:user) { build :user } # FactoryGirl

...

describe '#perform' do
  # some lets here

  include_context 'a UserWorker', user

  context 'when something exists' do
    it 'does some stuff' do
      # test some stuff here
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但这给了我这个错误:

/.rvm/gems/ruby-2.3.0@fb-cont/gems/rspec-core-3.5.1/lib/rspec/core/example_group.rb:724:in `method_missing': `user` is not available on …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails rspec-rails rspec3 ruby-on-rails-5

4
推荐指数
2
解决办法
2359
查看次数