2017-03-07 3 views
0

rspec expect message docsによると、(...)受信を期待しますしかし、時間の範囲が実際に渡されていることを確認したいのであれば、どうすればいいですか?RSpecのは、私たちは次のようなコードを使用する場合(TIME_RANGE)

def in_date_range(range) 
    activities.by_created_at(range) 
end 

などのテスト:これはTypeError: can't iterate from Timeで失敗

it 'passes correct arguments' do 
    range = Time.new(0)..(Time.new(0) + 1.hour) 

    expect(activities).to receive(:by_created_at).with(range) 

    in_date_range(range) 
end 

例えば

、私はこの方法は、(それが簡略化されています)正しい引数を指定して適切なメッセージを送ることをテストしたかったです

rspecが私の時間範囲で#===に電話をかけようとしていることが原因であると疑われています。

私の時間範囲が実際に渡す範囲であることを確認する方法はありますか?

私は実際に重なり合う時間を探しているのではなく、範囲が同じである:同じ開始点と終了点を持っています。

私たちがこれを行う方法の1つはカスタムマッチャーを書くことですが、それは珍しいルートのようです。

EDIT

別の可能な解決策は、2つの断片にメソッドを分割することである。

def compute_range(time_in) 
    (computations) 
    time1..time2 
end 

def in_date_range(time_in) 
    range = compute_range(time_in) 
    activities.by_created_at(range) 
end 

そして私はそれが適切な範囲を返す計算方法をテストすることができ、より大きな方法I正しい入力に合格したかどうかをテストし、小さいメソッドの出力を最初のメソッドから受け取り、もう一方のメソッドに渡して、メッセージ内の範囲のチェックの混乱を避けることができます。

これは完全には答えていません - rspec receive(:message)を使って「特定の範囲を受信する」ことを確認する方法はありますが、今は十分です。

答えて

0

EDIT:

私はこれを見て少しより多くの時間を持っていた、と私はエラーがactivities.by_created_at(range)内のどこかにあると思います。範囲のループを呼び出そうとしている必要があります。

以下は合格スペックです。私はダミーThingクラスを作成し、それに対してテストを実行し、すべてが合格しました:

class Thing 
    def initialize(name) 
    @name = name 
    end 

    def in_date_range(range) 
    activities.by_created_at(range) 
    end 
end 

describe Thing do 
    specify 'Thing test' do 
    name = 'Tim' 
    expect(Thing).to receive(:new).with(name) 

    Thing.new(name) 
    end 

    specify 'Time test' do 
    range = Time.new(0)..(Time.new(0) + 1.hour) 
    t = Thing.new('Jimmy') 

    expect(t).to receive(:in_date_range).with(range) 

    t.in_date_range(range) 
    end 
end 

~/test (master) 
18:22:21$ rspec spec/models/thing_spec.rb 
Loading Enhanced Logger. 
Run options: include {:focus=>true} 
.. 

Finished in 0.14094 seconds (files took 2.89 seconds to load) 
2 examples, 0 failures 

のEND EDIT

問題はRSpecの範囲をチェックしていないです。

私はこれを実行し、それが働いた:

describe Thing do 
    specify 'Thing test', :focus do 
    range = 1..4 
    expect(Thing).to receive(:new).with(range) 

    Thing.new(1..4) 
    end 
end 


Run options: include {:focus=>true} 
. 

Finished in 0.09132 seconds (files took 2.59 seconds to load) 
1 example, 0 failures 

問題は時間が反復可能な作りです。 Iterate over Ruby Time object with delta

受け入れ答えの2番目の部分はあなたを助ける必要があります。

は、この質問を参照してください。 makandracardsから

+0

ああ面白いの後に完全に発生した後、

Aは完全に起こります!なぜ私はそれをチェックしなかったのかわかりません。それはいくつかの光を放つ。質問はTimeインスタンスを指定するために編集されましたが、時間を反復可能にすることの妥当性を理解していません –

0

テスト2つの日付または時刻がAとBの重複が症例の多くをカバーする必要がある範囲であれば2つの期間は、Rubyまたはレール

にチェックマークを重複する場合

Aが部分的に重複B A囲みB B囲みA Aが完了した後にB Bが完全に発生した後 これらのすべてをカバーする1つのトリック単一の式を持つasesは、各範囲の開始日が同じ方向の他の範囲の終了日を見ているかどうかを確認することです。

以下のコードは、Ruby on Railsでこれを実装する方法を示しています。この例は2つの属性#start_dateと#end_dateを持つクラスIntervalです。これらの日付は包括的とみなされます。つまり、別の間隔が始まる日に1つの間隔が終了すると、その2つの間隔が重複しているとみなされます。

ロードされたRubyオブジェクトのバージョン(間隔#重複?)と、すべての重複間隔(Interval.overlapping)を返すスコープの両方を実装したことに注意してください。あなたの問題に応じて、それらの1つまたは両方が必要になる場合があります。

class Interval < ActiveRecord::Base 

    validates_presence_of :start_date, :end_date 

    # Check if a given interval overlaps this interval  
    def overlaps?(other) 
    (start_date - other.end_date) * (other.start_date - end_date) >= 0 
    end 

    # Return a scope for all interval overlapping the given interval, including the given interval itself 
    named_scope :overlapping, lambda { |interval| { 
    :conditions => ["id <> ? AND (TIMEDIFF(start_date, ?) * TIMEDIFF(?, end_date)) >= 0", interval.id, interval.end_date, interval.start_date] 
    }} 

end 

アルゴリズム

の説明あなたは、このようなアルゴリズムを描くことができます:「両方の範囲の始まりは、他の範囲の終わりを見れば、彼らの両方が同じ方向に見えるのですか? "

あなたが紙の上に描く場合は、この文は、両方の範囲が重複し、すべてのケースに当てはまることがわかります。

Aが部分的にAがB Bは、あなたがまたあることがわかります を囲んで囲んでB と重なります範囲が重ならないところ文は偽である:B Bが

+0

ああ、残念ながら、私の質問では十分ではありませんでした。私は時間がある時間範囲にあるというテストを探しているのではなく、むしろ範囲が別の範囲と等しいことを見いだしています。 –

+0

あなたが見るならば、これだけです。これは、開始と終了の2つのセットの2つのセットを比較します。 – OneNeptune

+0

私が「平等」と言うとき、私は「開始時間は同じで終了時間は同じです」と意味しました。あなたの関数は、私がそれを完全に誤解しない限り、重複をチェックします。 ところで、私は上品な数学を感謝します。それはあなたの問題に対するきれいな解決策です、残念ながらそれは私の問題ではありません。 –

関連する問題