use*_*062 13 ruby-on-rails rspec2 ruby-on-rails-3 factory-bot
我用:
gem 'rails', '3.2.11'
gem 'rspec-rails', '2.13.2'
gem 'webrat', '0.7.3'
gem 'factory_girl_rails', '4.1.0'
gem 'spork', '~> 0.9.0.rc'
Run Code Online (Sandbox Code Playgroud)
我想测试我的HP,我总是有一个指向某个用户的链接,因此HP的页面控制器包含:
@user = User.find(7)
Run Code Online (Sandbox Code Playgroud)
惠普的视图包含:
link_to 'See user', @user
Run Code Online (Sandbox Code Playgroud)
问题是所有测试都失败,因为测试数据库没有id为7的用户.我试过:
FactoryGirl.define do
factory :user do
name "Testuser"
id "7"
end
end
Run Code Online (Sandbox Code Playgroud)
......但这不起作用.始终存在错误:
规格如下:
describe "GET 'home'" do
before(:each) do
FactoryGirl.create(:user)
end
it "should be successful" do
get 'home'
response.should be_success
end
end
Run Code Online (Sandbox Code Playgroud)
失败/错误:获取'home'ActiveRecord :: RecordNotFound:找不到id = 7的用户
惠普在现实中工作得很好,只是测试失败了.我怎样才能保证这个测试不会失败?
Jam*_*ier 10
根据文档的" 使用工厂"部分,我将id
在规范中设置类似于:
@user = FactoryGirl.create(:user, :id => 7)
Run Code Online (Sandbox Code Playgroud)
如何模拟/存根(更快的规范,不保存对象到数据库):
let(:user) { FactoryGirl.build(:user) }
let(:id) { '1' }
before do
user.stub(:id).and_return(id) # just to illustrate, not necessary if stubbing the find class method
User.stub(:find).and_return(user)
end
it { expect(user.id).to eq(id) } # just to illustrate
it { expect(response).to be_success }
it { expect(assigns(:user)).to eq(user) }
Run Code Online (Sandbox Code Playgroud)
如果您仍然遇到仅实例化用户的问题,您仍然可以使用上述技术但替换FactoryGirl.build(:user)
为FactoryGirl.create(:user)