10

RSpec を使用して、gem でクラス レベルのインスタンス変数 (およびセッター) をテストしています。以下をテストする必要があります。

  1. セッターが使用されない場合は、正しいデフォルト値が提供されます。
  2. 変数は、セッターを介して正常に更新できます。

ここには明らかに実行順序の問題があります。セッターを使用して値を変更すると、デフォルト値の記憶が失われます。セッター テストの前にそれを変数に保存し、最後に値をリセットすることはできますが、それはすべてのセッター テストが同じプラクティスに従っている場合にのみ私を保護します。

変数のデフォルト値をテストする最良の方法は何ですか?

簡単な例を次に示します。

class Foo
  class << self
    attr_accessor :items
  end
  @items = %w(foo bar baz) # Set the default
  ...
end

describe Foo do

  it "should have a default" do
    Foo.items.should eq(%w(foo bar baz))
  end

  it "should allow items to be added" do
    Foo.items << "kittens"
    Foo.items.include?("kittens").should eq(true)
  end
end
4

3 に答える 3

13
class Foo
  DEFAULT_ITEMS = %w(foo bar baz)

  class << self
    attr_accessor :items
  end

  @items = DEFAULT_ITEMS
end

describe Foo do
  before(:each) { Foo.class_variable_set :@items, Foo::DEFAULT_ITEMS }

  it "should have a default" do
    Foo.items.should eq(Foo::DEFAULT_ITEMS)
  end

  it "should allow items to be added" do
    Foo.items << "kittens"
    Foo.items.include?("kittens").should eq(true)
  end
end

または、より良い方法は、クラスをリロードすることです

describe 'items' do
  before(:each) do
    Object.send(:remove_const, 'Foo')
    load 'foo.rb'
  end
end
于 2012-12-28T01:26:04.797 に答える