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'

特定のユーザーへのリンクを常に持っている HP をテストしたいので、HP のページコントローラーには以下が含まれます。

@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

失敗/エラー: 「ホーム」を取得 ActiveRecord::RecordNotFound: ID=7 のユーザーが見つかりませんでした

HP は実際には問題なく動作していますが、テストが失敗するだけです。このテストが失敗しないことをどのように保証できますか?

4

5 に答える 5

11

ドキュメントのUsing Factoriesセクションに基づいて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 に答える
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カピバラのようなものを使用して仕様で行う必要があります。

于 2016-08-08T04:59:51.843 に答える