我在为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
答案 0 :(得分:2)
self.where(:text => nil)
是ActiveRecord::Relation
- 在您尝试对其执行某些操作之前,查询实际上并未触发(例如迭代它,附加到它等等。)
在这种情况下,与您对should
的调用发生在同一行,即在工厂创建实例之后。
解决此问题的一种方法是强制评估before
块中的关系,例如在其上调用.all
。