我正在尝试运行该$ 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从版本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) 我正在使用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,但是这样做会中断。我直接从文档中提取了以下内容:
如果该方法出现在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提供的保护,如何解决此问题?
我正在尝试编写一个Git预提交钩子,如果有一个标记的示例,它将不允许用户提交:focus.
使用RSpec的API(好吧即使它是私有的),有没有办法找出:focus过滤器的例子数量?
我找到了example_count-instance_method.它可能很有用,但我不确定如何从外部脚本调用它.
我想测试我在其中运行两次 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) 我最近将我的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等等.到目前为止,没有任何工作.
谢谢你的帮助.
我试图使用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相同并试图将存根放在实际规范之前,但仍在进行外部请求.
我在中定义了一个工厂<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实现上述目标。但是我想知道是否有任何辅助方法来获取模型类的所有定义。
我希望在引发异常的情况下先发出两次对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)
但是一个允许覆盖另一个.如何设置存根以在前几次尝试中引发错误然后让它返回一个值?
我有这个代码,我想在几个规范中重用:
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) rspec3 ×10
rspec ×7
ruby ×5
rspec-rails ×3
authlogic ×1
devise ×1
factory-bot ×1
git ×1
mocking ×1
testing ×1