10

私はこのように構成されたテストスイートを持っています:

let(:cat) { create :blue_russian_cat } 
subject { cat }

context "empty bowl" do
  let!(:bowl) { create(:big_bowl, amount: 0) }
  before { meow }

  # a ton of `its` or `it` which require `meow` to be executed before making assertion
  its(:status) { should == :annoyed }
  its(:tail) { should == :straight }
  # ...

  # here I want to expect that number of PetFishes is going down after `meow`, like that
  it "will eat some pet fishes" do
    expect {???}.to change(PetFish, :count).by(-1)
  end
end

expect通常、このブロックを次のようにコンテキスト呼び出しの外に配置します。

  it "will eat some pet fishes" do
    expect { meow }.to change(PetFish, :count).by(-1)
  end

ただし、関連するコードがそのコンテキストの外に配置されるため、コードが少し読みにくくなります。

4

3 に答える 3

4

両方のテストをexpect構文に変更して、同じ下に置くことを検討しますcontextか? おそらく次のようなものです:

let(:cat) { create :blue_russian_cat } 

context "empty bowl" do
  let!(:bowl) { create(:big_bowl, amount: 0) }
  let(:meowing) { -> { meow } } # not sure what meow is, so may not need lambda

  it "will annoy the cat" do
    expect(meowing).to change(cat.status).from(:placid).to(:annoyed)
  end

  # here I want to expect that number of PetFishes is going down after `meow`
  it "will eat some pet fishes" do
    expect(meowing).to change(PetFish, :count).by(-1)
  end
end
于 2013-05-23T01:47:48.853 に答える
3

beforeブロックに期待を設定しません。その目的は、環境をセットアップすることです (また、仕様のに実行されるため、何かを期待するには遅すぎます)。あなたは定期的に欲しいlet

context "empty bowl" do
  let(:cat) { meow }

  # here I want to expect that number of PetFishes is going down after `meow`, like that
  it "will eat some pet fishes" do
    expect {cat}.to change(PetFish, :count).by(-1)
  end
end
于 2013-05-22T20:28:21.590 に答える
0

インスタンス変数の使用は理想的とは言えませんが、感性が許せば、次のようにすることができます。

context "empty bowl" do
  # ...
  before { @pet_fish_change = change_to(PetFish, :count) {meow} }

  it "will eat some pet fishes" do
    expect(@pet_fish_change).to eq(-1)
  end

  # ...

end

ヘルパーメソッドを定義する必要がありますchange_toが、それは本当に簡単です:

def change_to(obj, method, &block)
  before = obj.send method
  yield
  (obj.send method) - before
end
于 2014-01-14T12:44:44.670 に答える