Pertanyaan RSpec: menentukan beberapa panggilan ke suatu metode dengan argumen berbeda setiap kali


Dalam rspec (1.2.9), apa cara yang benar untuk menentukan bahwa suatu objek akan menerima beberapa panggilan ke suatu metode dengan argumen yang berbeda setiap waktu?

Saya bertanya karena hasil yang membingungkan ini:

describe Object do

  it "passes, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1) # => Mock "foo" expected :bar with (1) once, but received it twice
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(1)
    foo.bar(2)
  end

  it "fails, as expected" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(2) # => Mock "foo" received :bar out of order
    foo.bar(1)
  end

  it "fails, as expected, but with an unexpected message" do
    foo = mock('foo')
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" received :bar with unexpected arguments
                 # =>   expected: (1)
                 # =>         got (999)
  end

end

Saya mengharapkan pesan kegagalan terakhir "diharapkan: (2)", bukan "diharapkan (1)". Sudahkah saya menggunakan rspec dengan salah?


32
2017-12-28 21:45


asal


Jawaban:


Mirip dengan ini pertanyaan. Solusi yang disarankan adalah menelepon as_null_object untuk menghindari kebingungan pesan. Begitu:

describe Object do
  it "fails, as expected, (using null object)" do
    foo = mock('foo').as_null_object
    foo.should_receive(:bar).once.ordered.with(1)
    foo.should_receive(:bar).once.ordered.with(2)
    foo.bar(1)
    foo.bar(999) # => Mock "foo" expected :bar with (2) once, but received it 0 times
  end
end

Outputnya tidak sama dengan kasus kedua Anda (yaitu "diharapkan 2 tetapi mendapat 999"), tetapi itu menunjukkan bahwa harapan itu tidak terpenuhi.


31
2017-12-29 00:16