13

我用:

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'

我想测试我的惠普,我总是有一个指向某个用户的链接,所以惠普的页面控制器包含:

@user = User.find(7)

并且视图 HP 包含:

link_to 'See user', @user

问题是所有测试都失败了,因为测试数据库没有 id 为 7 的用户。我试过:

FactoryGirl.define do
  factory :user do
    name "Testuser"
    id "7"
  end
end

...但这不起作用。总是有错误:

规格是这样的:

describe "GET 'home'" do

    before(:each) do
      FactoryGirl.create(:user)
    end

    it "should be successful" do
      get 'home'
      response.should be_success
    end
end

失败/错误:获取 'home' ActiveRecord::RecordNotFound: 找不到 id=7 的用户

惠普实际上工作正常,只是测试失败。我如何保证这个测试不会失败?

4

5 回答 5

11

根据文档的使用工厂部分,我将id在规范本身中设置如下内容:

@user = FactoryGirl.create(:user, :id => 7)
于 2013-07-18T16:04:45.993 回答
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) }

如果您仍然对仅实例化用户有问题,您仍然可以使用上述技术,但替换FactoryGirl.build(:user)FactoryGirl.create(:user)

于 2013-07-19T08:29:19.613 回答
3

不是答案,而是怀疑……您可能不应该按照自己的方式编写规范。

在您的规范中执行以下操作:

u=FactoryGirl.create(:user)
User.where('id=?',u.id).count.should == 1

让你的测试依赖于特定的 id 是灾难的根源。

于 2013-07-18T17:15:41.710 回答
1

您可以通过执行类似的操作来设置用户的 ID

before
  u = FactoryGirl.create(:user)
  u.update_attribute(:id, 7)
end

然而,这有点奇怪。您甚至可能会遇到用户 7 的情况。

但是,您可以做的是使用 Rspec 的存根来获取正确的用户。例如你可以做类似的事情

let(:user_7) { FactoryGirl.create(:user) }
before { User.stub(:find).with(7).and_return(user_7) }
于 2013-07-18T16:02:35.607 回答
0

在您的情况下,我确定您只是在检查是否正在使用用户 ID 而不是特定 ID。

当我编写测试时,我只是得到从数据库返回的 id,它更可靠,更接近你在现实中所做的事情。

我会写这样的控制器规范。

RSpec.describe MyController, type: :controller do
  let(:user) { FactoryGirl.create(:user) }
  before do
    # login the user here which would resolve which user id is being used
    sign_in user #assumes you are using warden test helpers
    get :home
  end

  it "allows the user to the page" do
     assert_response :ok
  end
end

这应该加载正常。如果你想仔细检查链接是否正确,你应该在feature规范中使用像 capybara 这样的东西。

于 2016-08-08T04:59:51.843 回答