web-dev-qa-db-ja.com

RSpec any_instanceの廃止:修正方法

私のRailsプロジェクトでは、any_instanceを使用してrspec-mocksを使用していますが、この非推奨メッセージを回避したい:

Using any_instance from rspec-mocks' old :should syntax without explicitly enabling the syntax is deprecated. Use the new :expect syntax or explicitly enable :should instead.

私の仕様は次のとおりです。

describe (".create") do
  it 'should return error when...' do
    User.any_instance.stub(:save).and_return(false)
    post :create, user: {name: "foo", surname: "bar"}, format: :json
    expect(response.status).to eq(422)
  end
end

ここに私のコントローラーがあります:

def create
    @user = User.create(user_params)
    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
end

new:expect syntaxを使用したいのですが、適切に使用する方法が見つかりません。

RSpec .0.2を使用しています。

44
Rowandish

使用する - allow_any_instance_of

describe (".create") do
  it 'returns error when...' do
    allow_any_instance_of(User).to receive(:save).and_return(false)
    post :create, user: {name: "foo", surname: "bar"}, format: :json
    expect(response.status).to eq(422)
  end
end
95
Uri Agassi

私はそれを再現することができます:

私のtest.rbファイルで:-

_#!/usr/bin/env Ruby

class Foo
  def baz
    11
  end
end
_

私のtest_spec.rbファイル

_require_relative "../test.rb"

describe Foo do
  it "invokes #baz" do
    Foo.any_instance.stub(:baz).and_return(20)
    expect(subject.baz).to eq(20)
  end
end
_

今私がそれを実行した場合:-

_arup@linux-wzza:~/Ruby> rspec
.

Deprecation Warnings:

Using `any_instance` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /home/arup/Ruby/spec/test_spec.rb:4:in `block (2 levels) in <top (required)>'.
_

今、私は changelog を見つけました

allow(Klass.any_instance)およびexpect(Klass.any_instance)は、warningを出力するようになりました。これは通常mistakeであり、ユーザーは通常、代わりに_allow_any_instance_of_または_expect_any_instance_of_が必要です。 (サムフィッペン

_test_spec.rb_を次のように変更します。

_require_relative "../test.rb"

describe Foo do
  it "invokes #baz" do
    expect_any_instance_of(Foo).to receive(:baz).and_return(20)
    expect(subject.baz).to eq(20)
  end
end
_

そしてそれは完全に動作します:-

_arup@linux-wzza:~/Ruby> rspec
.

Finished in 0.01652 seconds (files took 0.74285 seconds to load)
1 example, 0 failures
arup@linux-wzza:~/Ruby>
_
5
Arup Rakshit