Rspecスタブチェーンで引数を渡すことができるかどうか/どのようにできるか疑問に思っています。例を挙げると、次のアクションがあるとします。
def index
@payments = Payment.order(:updated_at).where(:paid => true)
@bad_payments = Payment.order(:some_other_field).where(:paid => false)
end
私のコントローラー仕様では、両方のメソッドをスタブ化して異なる結果を返すことができるようにしたいと思います。 @payments
フィールドのみがアクションに含まれている場合は、次のようなものを使用します。
Payment.stub_chain(:order, :where) { return_this }
しかしもちろん、それは@bad_payments
に同じ値を返します。
つまり、スタブ条件として:updated_at
と:paid => true
を含めるにはどうすればよいですか?
あなたはこれを使うことができます:
Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }
ネストされたスタブブロックを使用できます。ブロックは引数を受け入れることができ、戻り値は関数の戻り値として使用されます。
tap
は呼び出し先を返さないため、stub
を使用します。 double
によって作成されたmockは、メソッドorder
の結果として返されます。このメソッドは、where
メソッドが再びスタブになります。
Payment.stub(:order) { |order|
double('ordered_payments').tap { |proxy|
proxy.stub(:where) { |where|
[order, where]
}
}
}
Payment.order(:updated_at).where(:paid => true)
# => returns [:updated_at, {:paid => true}]