2017-01-26 1 views
5

のインスタンスとして登録していない、私は次のようなコードを持っている:レール:サブクラスは私が働いているのRailsアプリでは、親クラス

# app/models/a.rb 
class A < ActiveRecord::Base; ...; end 
# app/models/b.rb 
class B < A; ...; end 

# /app/elsewhere... 

do_case(B.new) 

def do_case(letter) 
    case letter 
    when A 
    "not nil" 
    end 
end 

私はローカルでこれを実行すると、期待通りに実行し、私は「ない取得戻り値として "nil"を返します。しかし、私はテスト環境でnilを取得します。

テスト環境は、AletterB.new)の先祖(B.ancestors)の間であるが、ケースの等価演算子またはis_a?(A)とサブクラスとして登録に失敗したことを示しています。

A === B.new #=> false in test environment, true locally 
B.new.is_a?(A) #=> false in test environment, true locally 

これはRailsの自動ロードの問題のように思えるが、私は親クラスが両方の環境での先祖に含まれている場合、これらのメソッドは失敗するだろう、なぜわかりません。どうしたの?

+0

は再現できませんでした。 – Ilya

+0

@Ilya私はそれがアプリケーションの他の多くのクラスによって引き起こされるオートローディングの問題だと確信しています。ここで再現するには大きすぎ、リポジトリにリンクするにはプライベートすぎる。 – steel

+0

これは 'spring'の問題である可能性が高いです。あなたは '春'を使っていますか?もしそうなら、最初に 'spring'を殺してからもう一度あなたのテストを試みてください。あなたが言ったように、 'case/when'は' is_a? '呼び出しを使用し、' B.new.is_a(A) 'は' true'を返します – etagwerker

答えて

0

これは自動ロードの問題のようです。理想的ではありませんが、Brequire_dependencyコールを追加することで解決できます。

どこまで根本的な問題があるかを調べるには、テスト環境にTestに存在しないライブラリの依存関係がある可能性があります。私はテストでREPLをロードし、Aを調べます。いくつかの有用な方法は:

​​

など

関連する問題