7

車と整備士のクラスがあるとしましょう。車には「走る」方法があります。整備士は何らかの理由で車を必要とします。次に、RSpec仕様を記述します。メカニックでは、次のような偽のクラスを定義します。

class Car; end

その後、メカニックが使用するメソッドをスタブします。テストを個別に実行すると、すべて正常に機能します。しかし、両方のテストを一緒に実行すると(rspec spec / directory /)、私のMechanic仕様は実際のCarクラスを使用します。

それで。これは、ルビーのクラスが「オープン」であり、車の仕様のためにクラスを一度ロードしたためだと思います。しかし、これを行うためのより良い方法はありますか?この種の状況のベストプラクティスは何ですか?これは、コードがおそらく緊密に結合されているため、コードにいくつかの改善が必要であることを意味しますか?

githubで簡単なデモを作成しました:https ://github.com/depy/RspecTest

4

3 に答える 3

2

Rubyクラスが開いているため、この偽のクラスは機能しません。

使用できるアプローチの1つは、letを使用してオブジェクトを希望どおりに初期化し、必要に応じてbeforeブロックの関係を操作することです。スタブもビフォアブロック内で歓迎されています。= p

これがお役に立てば幸いです。

于 2012-11-28T17:59:37.377 に答える
2

必要なのは2層テストだと思います。

  • ユニット仕様:各クラスを個別にテストする
  • 統合仕様:全体としてのテスト

次のようなコードが与えられます:

class Car
end

class Mechanic
  def fix(car)
    # do something here
  end
end

ユニット仕様の場合、依存関係をスタブします。次に例を示します。

describe Mechanic do
  let(:mechanic) { described_class.new }
  let(:car)      { stub(stubbed_method_on_car: 14) } # Or just OpenStruct.new(stubbed_method_on_car: 14)

  it 'does some stuff' do
    mechanic.fix(car).should eq true
  end
end

統合仕様の場合、私はこれを行います:

describe Mechanic do
  let(:mechanic) { FactoryGirl.create(:mechanic) }
  let(:car)      { FactoryGirl.create(:car) }

  it 'does some stuff' do
    mechanic.fix(car).should eq true
  end
end
于 2012-11-28T18:49:47.707 に答える
-1

Rspecには、スタブ定数のサポートが組み込まれています。

于 2015-01-16T12:30:48.040 に答える