0

我在为我的 rails 应用程序创建 rspec 测试时遇到了一些问题。

假设我有一个名为 MyModel 的模型,它具有以下函数,它获取所有具有空文本的 MyModel 的实例

self.searchEmtpy:
  self.where(:text => nil)
end

我已经定义了以下测试,它检查具有空文本的新 MyModels 是否应该由前一个函数返回。我使用 FactoryGirl 进行模型创建。

describe "get empty models" do
  before do
    @previousModels=MyModel.searchEmtpy
    @newModel=Factory(:myModel, :text => nil)
  end
  it "new empty models should appear" do
    currentModels=MyModel.searchEmtpy
    (previousModels << @newModel).should eq(currentModels)
  end
end

测试很简单,但它不起作用。我不知道为什么,但是,根据我从输出中了解到的情况,在“应该”行上,previousModels 已经包含 newModel,因此测试失败(它包含 @newModel 2 次。我我遗漏了一些明显的东西?“它”里面的指令不是按顺序调用的吗?

为了澄清,以下测试不会失败,它应该:

describe "get empty models" do
  before do
    @previousModels=MyModel.searchEmtpy
    @newModel=Factory(:myModel, :text => nil)
  end
  it "new empty models should appear" do
    currentModels=MyModel.searchEmtpy
    (previousModels).should eq(currentModels)
  end
end
4

1 回答 1

2
 self.where(:text => nil)

ActiveRecord::Relation- 查询实际上不会触发,直到您尝试对其执行某些操作(例如迭代它、附加到它等)

在这种情况下,这与您对 的调用发生在同一行should,即在工厂创建实例之后。

解决此问题的一种方法是强制评估before块中的关系,例如调用.all它。

于 2013-01-30T15:41:07.773 回答