工厂女孩的rspec let行为
我正在尝试使用FactoryGirl为我的一个控制器规格创建一些项目: 摘录:工厂女孩的rspec let行为,rspec,factory-bot,Rspec,Factory Bot,我正在尝试使用FactoryGirl为我的一个控制器规格创建一些项目: 摘录: describe ItemsController do let(:item1){Factory(:item)} let(:item2){Factory(:item)} # This fails. @items is nil because Item.all returned nothing describe "GET index" do it "should assi
describe ItemsController do
let(:item1){Factory(:item)}
let(:item2){Factory(:item)}
# This fails. @items is nil because Item.all returned nothing
describe "GET index" do
it "should assign all items to @items" do
get :index
assigns(:items).should include(item1, item2)
end
end
# This passes and Item.all returns something
describe "GET show" do
it "should assign the item with the given id to @item" do
get :show, id => item1.id
assigns(:item).should == item1
end
end
end
当我将let更改为以下内容时:
before(:each) do
@item1 = Factory(:item)
@item2 = Factory(:item)
end
我把@s放在变量前面,一切正常。为什么带有let的版本不起作用?我试着把let换成let!他看到了相同的行为
let(:item1) { FactoryGirl.create(:item) }
let(:item2) { FactoryGirl.create(:item) }
实际上,当您让:item1执行延迟加载时,它将在内存中创建对象,但不将其保存在数据库中
@item1 = Factory(:item)
它将在数据库中创建对象
试试这个:
describe ItemsController do
let!(:item1){ Factory(:item) }
let!(:item2){ Factory(:item) }
describe "GET index" do
it "should assign all items to @items" do
get :index
assigns(:items).should include(item1, item2)
end
end
describe "GET show" do
it "should assign the item with the given id to @item" do
get :show, id => item1.id
assigns(:item).should == item1
end
end
end
如果不调用let,它将永远不会被实例化,而:let!在每次方法调用之前强制计算
或者您可以这样做:
describe ItemsController do
let(:item1){ Factory(:item) }
let(:item2){ Factory(:item) }
describe "GET index" do
it "should assign all items to @items" do
item1, item2
get :index
assigns(:items).should include(item1, item2)
end
end
describe "GET show" do
it "should assign the item with the given id to @item" do
get :show, id => item1.id
assigns(:item).should == item1
end
end
end
实际上,当您让:item1执行延迟加载时,它将在内存中创建对象,但不将其保存在数据库中
@item1 = Factory(:item)
它将在数据库中创建对象
试试这个:
describe ItemsController do
let!(:item1){ Factory(:item) }
let!(:item2){ Factory(:item) }
describe "GET index" do
it "should assign all items to @items" do
get :index
assigns(:items).should include(item1, item2)
end
end
describe "GET show" do
it "should assign the item with the given id to @item" do
get :show, id => item1.id
assigns(:item).should == item1
end
end
end
如果不调用let,它将永远不会被实例化,而:let!在每次方法调用之前强制计算
或者您可以这样做:
describe ItemsController do
let(:item1){ Factory(:item) }
let(:item2){ Factory(:item) }
describe "GET index" do
it "should assign all items to @items" do
item1, item2
get :index
assigns(:items).should include(item1, item2)
end
end
describe "GET show" do
it "should assign the item with the given id to @item" do
get :show, id => item1.id
assigns(:item).should == item1
end
end
end
嗨,谢谢你的建议。这并没有解决问题。最后我的问题是我已经试过了。嗨,谢谢你的建议。这并没有解决问题。最后我的问题是我已经试过了。