6

それは私だけですか、それともグローバルな RSpec の動作ですか? Rails モデルに scope という名前を付け、:publicこのモデルからオブジェクトを初期化し、このオブジェクトをスタブすると Rspec が失敗します

class DocumentName < ActiveRecord::Base

  scope :public,    lambda{where( public: true) }  #line 3
end

特別なことは何もありません。Rails アプリケーションは動作します

DocumentName.public  # => [ #DN, #DN, #DN... ]
# SELECT `document_names`.* FROM `document_names` WHERE `document_names`.`public` = 1

ただし、RSpec は失敗します

describe DocumentName do
  let(:resource){DocumentName.new}  
  it do
     resource.stub(:name).and_return('foo')   #line 16
     resource.save.should be true
  end
end

 Failure/Error: resource.stub(:name).and_return('foo')
 ArgumentError:
   wrong number of arguments (1 for 0)
 # ./app/models/document_name.rb:3:in `block in <class:DocumentName>'
 # ./spec/models/document_name_spec.rb:16:in `block (2 levels) in <top (required)>'

...そして面白いことに、このシナリオではその範囲で何もしていません。

:publicただし、このスコープにeg:以外の名前を付けた場合:are_public:

class DocumentName < ActiveRecord::Base
  scope :are_public,    lambda{where( public: true) }
end

...すべてパス O_O

Rails 3.2.11 (but same thing on any 3.2.x)
Ruby ruby-2.0.0-rc1 ( but same for any ruby-1.9.3) 
rspec-core (2.12.2)
rspec-expectations (2.12.1)
rspec-mocks (2.12.1)
rspec-rails (2.12.2)
4

1 に答える 1

6

privateおよびpublicRuby のアクセス修飾子です。

class User
  private
  def some_private_method
  end

  public
  def some_public_method
  end
end

これらはキーワードのように見えるかもしれませんが、実際にはメソッド呼び出しです。それらを上書きするのは本当に良い考えではありません。

于 2013-01-25T12:15:55.840 に答える