1

虽然正确,但标题需要一些解释:)

我有这堂课:

class Character
  include DataMapper::Resource

  def self.tick_all
    all.collect &:tick
  end

  def tick
    # do stuff
  end

end

如您所见,何时Character.tick_all调用其所有实例都应接收tick调用。它按预期工作:当我启动控制台时,里面的东西tick就完成了。但我无法通过测试:

describe ".tick_all" do
  let(:instance) { FactoryGirl.create(:character) }
  it "invokes #tick for every instance" do
    Character.tick_all
    instance.should_receive(:tick)
  end
end

失败的例子:

Failure/Error: instance.should_receive(:tick)
  (#<Character:0x00000002fa4e28>).tick(any args)
      expected: 1 time
      received: 0 times
4

1 回答 1

1

期望应该在方法调用之前设置:

describe ".tick_all" do
  let(:instance) { FactoryGirl.create(:character) }
  it "invokes #tick for every instance" do
    instance.should_receive(:tick)
    Character.tick_all
  end
end

UPD:上面的代码不起作用。这个变种呢?

describe ".tick_all" do
  it "invokes #tick for every instance" do
    Character.any_instance.should_receive(:tick)
    Character.tick_all
  end
end

UPD2:Aaand 另一个版本:

describe ".tick_all" do
  it "invokes #tick for every instance" do
    tick_count = 0
    Character.any_instance.stub(:tick) { tick_count += 1 }
    Character.tick_all

    tick_count.should == Character.count
    # or
    # expect{ Character.tick_all }.to change{tick_count}.by(Character.count)
  end
end
于 2013-05-08T17:54:04.087 回答