我正在写下面的测试:
let!(:city_areas) { FactoryGirl.create_list(:city_area, 30) }
before {
@city_areas = mock_model(CityArea)
CityArea.should_receive(:where).and_return(city_areas)
}
it 'should assign the proper value to city areas variable' do
get :get_edit_and_update_vars
assigns(:city_areas).should eq(city_areas.order("name ASC"))
end
测试以下方法:
def get_edit_and_update_vars
@city_areas = CityArea.where("city_id = '#{@bar.city_id}'").order("name ASC").all
end
然而,它失败了,说没有nil的方法'city_id':NilClass,让我相信它仍在尝试使用实例变量@bar。
如何正确地将这个where语句存根以防止这种情况?
答案 0 :(得分:1)
你为什么要做@city_areas = mock_model(CityArea)然后你再也不用@city_areas了?
我会这样测试:
模型CityArea中的为此创建一个命名范围:where(“city_id ='#{@ bar.city_id}'”)。order(“name ASC”)
然后在您的控制器规范中
describe 'GET get_edit_and_update_vars' do
before(:each) do
@areas = mock('areas')
end
it 'gets the areas' do
CityArea.should_receive(:your_scope).once.and_return(@areas)
get :get_edit_and_update_vars
end
it 'assign the proper value to city areas variable' do
CityArea.stub!(:your_scope => @areas)
get :get_edit_and_update_vars
assigns(:city_areas).should eq(ordered)
end
end
您还应该在模型规范
上为该新范围创建规范 只是一个提示,你不应该在before块里面使用should_receive(...),使用stub!在before之前,当你想测试该方法时使用should_receive 另外,在测试控制器时你不应该使用factorygirl,你应该总是模拟模型,模型可以在模型规范上测试