1

クラスがあるとします:

class Product
  def initialize(v)
    @var = v
  end
end

クラスのインスタンス化がうまくいったかどうかを RSpec でテストしたいと思います。クラスまたは単体テスト内でテストする必要がありますか?どうすればそれを行うことができますか?

4

2 に答える 2

1

イニシャライザがそれほど単純な場合は、テストする価値はありません。一方、パラメータ チェックやその他のロジックをイニシャライザに追加する場合は、テストすることをお勧めします。

ほとんどの場合、その場合の良い方法は、パラメーターが間違っている場合に IllegalArgumentError を発生させることです。この場合、オブジェクトの初期化でエラーが発生した (または発生しなかった) ことを確認できます。

もっと複雑なことをしているなら、インスタンス変数の値をチェックしたくなるかもしれません。attr_readerテスト目的でクラスの実装を変更するのは悪い考えだと思うので、これを使用するのは良い考えではないと思います。代わりに#instance_variable_get、変数を読み取るために使用します。

class Foo
  def initialize(mandatory_param, optional_param = nil)
    raise IllegalArgumentError.new("param cannot be #{param}") if mandatory_param == 42
    @var1 = mandatory_param
    @var2 = optional_param unless param.is_a? String
  end
end

describe Foo do
  it "should not accept 42 as an argument" do
    expect { Foo.new(42, 'hello') }.to raise_error(IllegalArgumentError)
  end

  it "should set var2 properly if it's not a String" do
    f = Foo.new('hello', 1)
    f.instance_variable_get(:@var2).should eq 1
  end

  it "should not set var2 if it's a String" do
    f = Foo.new('hello', 'world')
    f.instance_variable_get(:@var2).should be_nil
  end
end
于 2013-02-13T23:04:33.277 に答える
0

RSpec、Test::Unit、Minitest などで状態を確認するには、クラスに attr_reader を追加する必要があります。しかし、あなたが話しているのは、基本的に言語としての Ruby が機能することをテストすることであり、実際には気にする必要はありません。

于 2013-02-13T22:55:14.610 に答える