1

RailsアプリにプレーンなRubyクラスがあり、テスト環境で再度開いています。基本的には

class A
  def get_dependency
    B
  end
  ... some other methods ...
end

そして、キュウリのテスト環境(features / env.rbからロードされたファイル)(およびrspecの同様の場所)では、

class A
  def get_dependency
    MockedB
  end
end

これは通常の実行では正常に機能しますが、Sporkを実行していると、奇妙に失敗します。クラスAのget_dependencyメソッドは適切に上書きされますが、他のすべてのパブリックメソッドが欠落しています。何か案は?

これは何らかの形でロード順序に関連していると思いますが、ファイルのrequireをSporkのプリロードセクションから移動しても変更はありませんでした。

4

2 に答える 2

0

考えられるシナリオの 1 つは、Aオートロードされるように設定されているが、キュウリ環境でオーバーライドを定義する場合、オートロードされる前に定義することです。A現在存在しているため、オートロードされることはありません。

メソッドをオーバーライドする前にオートローダーを呼び出す可能な解決策は次のとおりです。

A.class_exec do
  def get_dependency
    MockedB
  end
end

その時点でオートロードできないConstMissing場合A(おそらくオートローダーがまだセットアップされていない場合) が発生します。

于 2012-04-17T18:21:13.720 に答える
0

これは素晴らしい答えではありませんが、回避策です。クラスを再度開く代わりに、シングルトン インスタンスを変更しました。コードは基本的に同じですが、A にインスタンス メソッドを追加しました。

class A
  def instance
    @@instance ||= A.new
  end
end

次に、テストコードでインスタンスを変更しました

instance = A.instance
def instance.get_dependency
  MockedB
end

そして、実際のコードが常に A.new ではなく A.instance を呼び出していることを確認する必要がありました。

于 2012-04-05T13:54:14.013 に答える