如何使用rspec和工厂女孩创建具有特定id的模型

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)

  • 对于那些通过谷歌发现这个问题的人.此解决方案现在有效(2015年8月) (4认同)
  • 这听起来像逻辑,但我仍然得到相同的错误信息. (2认同)

Pie*_*ois 9

如何模拟/存根(更快的规范,不保存对象到数据库):

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)