非常简单的Rspec rails测试没有通过,它应该在哪里

时间:2013-01-30 15:35:20

标签: ruby-on-rails ruby-on-rails-3 rspec factory-bot rspec-rails

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

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

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

我已经定义了以下测试,该测试检查具有空文本的新MyModel应该由前一个函数返回。我使用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

测试非常简单,但不起作用。我不知道为什么,但是,对于我从输出中理解的东西,它接缝,在“应该”行,previousModel已经包含newModel,因此测试失败(它包含@newModel 2次。 我错过了一些明显的东西? “it”里面的指令是不是按顺序调用了?

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

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

1 个答案:

答案 0 :(得分:2)

 self.where(:text => nil)

ActiveRecord::Relation - 在您尝试对其执行某些操作之前,查询实际上并未触发(例如迭代它,附加到它等等。)

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

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