0

RSpec にミックスしているモジュールの RSpec で定義したインスタンス変数にアクセスしようとしていますが、これを機能させることができないようです。

単純化された仕様ファイルは、私が抱えている問題を示しています。

my_spec.rb

require 'rspec'

describe 'passing instance variables from specs into ruby mixins' do
  it 'should pass the instance variable to the module' do
    @a = 'a'
    A.a.should == 'a'
  end

  it 'should pass the instance variable to the module in the module' do
    @b = 'b'
    A.b.should == 'b'
  end

  it 'should pass instance varisables from one module to the other' do
    A.c.should == 'c'
  end

end

module B
  def b
    return @b
  end

  def c
    return @c
  end
end

module A
  extend B
  @c = 'c'
  def self.a
    return @a
  end
end

結果:

1) passing instance variables from specs into ruby mixins should pass the instance variable to the module
     Failure/Error: A.a.should == 'a'
       expected: "a"
            got: nil (using ==)
     # ./spec/my_spec.rb:6:in `block (2 levels) in <top (required)>'

  2) passing instance variables from specs into ruby mixins should pass the instance variable to the module in the module
     Failure/Error: A.b.should == 'b'
       expected: "b"
            got: nil (using ==)
     # ./spec/my_spec.rb:11:in `block (2 levels) in <top (required)>'

基本的に、モジュールAとBの両方でインスタンス変数@a、@bにアクセスできるようにしたいです。クラス変数@@aと@@bを使用しようとしましたが、これは機能しません。

グローバル変数 ($a および $b) を使用できますが、これは機能しますが、悪であるグローバル変数であるため、これはエレガントではないと感じています。

作業コード:

require 'rspec'

describe 'passing instance variables from specs into ruby mixins' do
  it 'should pass the instance variable to the module' do
    $a = 'a'
    A.a.should == 'a'
  end

  it 'should pass the instance variable to the module in the module' do
    $b = 'b'
    A.b.should == 'b'
  end

  it 'should pass instance varisables from one module to the other' do
    A.c.should == 'c'
  end

end

module B
  def b
    return $b
  end

  def c
    return @c
  end
end

module A
  extend B
  @c = 'c'
  def self.a
    return $a
  end
end

何か案は?

4

1 に答える 1

1

それらは同じ名前を共有していますが、それらが定義されているインスタンスにスコープが設定されているため、個別にスコープが設定されています。

つまり、スペックで設定したインスタンス変数は、それらのスペックのスコープ内にのみ存在します。同様に、モジュール内のインスタンス変数も同様にそのコンテキストにスコープされます。

例が抽象化されているため、達成しようとしているものと一致するかどうかはわかりませんが、これを試してください:

require 'rspec'

module B
  def b= b
    @b = b
  end

  def b
    return @b
  end

  def c= c
    @c = c
  end

  def c
    return @c
  end
end

module A
  extend B

  @c = 'c'

  def self.a= a
    @a = a
  end

  def self.a
    return @a
  end
end

describe 'passing instance variables from specs into ruby mixins' do
  it 'should pass the instance variable to the module' do
    A.a = 'a'
    A.a.should == 'a'
  end

  it 'should pass the instance variable to the module in the module' do
    A.b = 'b'
    A.b.should == 'b'
  end

  it 'should pass instance varisables from one module to the other' do
    A.c.should == 'c'
  end
end

attr_accessorこれは、getter/setter メソッドを手動で定義する代わりに使用するために単純化できます。

問題は、Ruby の中身をテストしているだけだということです。

あなたが解決しようとしている問題を誤解しましたか?

于 2012-06-22T04:48:40.697 に答える