0

私は RSpec を初めて使用し、Factory Girl をコントローラーの仕様に関連付けて使用することに頭を悩ませようとしています。難しさは次のとおりです。

したがって、次のようなモデルがある場合:

class Brand < ActiveRecord::Base
  belongs_to :org    
  validates :org, :presence => true
end

class Org < ActiveRecord::Base
  has_many :brands
end

そして、このような工場:

FactoryGirl.define do
  factory :brand do
    association :org
  end
end

このコントローラの仕様は失敗します:

describe BrandsController do
  describe "POST create with valid params" do
    it "creates a new brand" do
      expect {
        post :create, brand: attributes_for(:brand)
      }.to change(Brand, :count).by(1)
    end
  end
end

(そして、「validates :org, :presence => true」をコメントアウトすると、合格します)

提案された解決策がいくつかありますが、単純なエラーを犯していると思います。つまり、それらのいずれも機能させることができませんでした。

1)このページの提案に従ってファクトリを org_id に変更すると、「検証に失敗しました: 組織を空白にすることはできません」で多くのテストに失敗しました

FactoryGirl.define do
  factory :brand do
    org_id 1002
  end
end

2) 「symbolize_keys」の使用は有望に見えます。 ここここでは、次のようなコードを使用することをお勧めします。

(FactoryGirl.build :position).attributes.symbolize_keys 

私の場合、これをどのように適用するかわかりません。以下は、うまくいかない推測です (No route matches {:controller=>"brands", :action=>"{:id=>nil, :name=>\"MyString\", :org_id= というエラーが発生します) >1052、:include_in_menu=>false、:created_at=>nil、:updated_at=>nil}"}):

describe BrandsController do
  describe "POST create with valid params" do
    it "creates a new brand" do
      expect {
        post build(:brand).attributes.symbolize_keys 
      }.to change(Brand, :count).by(1)
    end
  end
end

アップデート

以下の塩山の回答でこれがほぼ機能しましたが、エラーメッセージが表示されました:

Failure/Error: post :create, brand: build(:brand).attributes.symbolize_keys
ActiveModel::MassAssignmentSecurity::Error:
  Can't mass-assign protected attributes: id, created_at, updated_at

したがって、この質問に続いて、次のように変更しました。

post :create, brand: build(:brand).attributes.symbolize_keys.reject { |key, value| !Brand.attr_accessible[:default].collect { |attribute| attribute.to_sym }.include?(key) }

どちらがうまくいきました!

4

1 に答える 1

2

ソリューション 2) では、アクションを渡していないためpost、エラーがスローされます。

expectそのブロックのコードを次のように置き換えてみてください。

post :create, brand: build(:brand).attributes.symbolize_keys
于 2012-10-04T21:30:30.007 に答える