0

次のフィールドを必要とする Client モデルがあります。

validates :name, :address1, :city, :state, :country, :zipcode,
:contactname, :email, presence: true

現在、新しいクライアントを作成するためのテストを書いています。fill_in "field_id", with: factory.field_value以下のコードに示すように、FactoryGirl でクライアント オブジェクトを作成します。

describe "with valid information" do
  let(:client) { FactoryGirl.create(:client) }

  before(:each) do
    visit new_client_path
    fill_in "client_name", with: client.name
    fill_in "client_address1", with: client.address1
    fill_in "client_city", with: client.city
    fill_in "client_state", with: client.state
    select client.country, from: "client_country"
    fill_in "client_zipcode", with: client.zipcode
    fill_in "client_contactname", with: client.contactname
    fill_in "client_email", with: client.email
  end

  it "should create a client" do
    expect { click_button "Create Client" }.to change(Client, :count)
  end

  describe "success messages" do
    before { click_button "Create Client" }
    it { should have_content('created') }
  end
end

ありがとう

4

1 に答える 1

1

コードに問題はありません。私が見ているそれを短縮する唯一の方法は、配列を反復処理することです:

%w(name address1 city state zipcode contactname email).each do |field|
  fill_in "client_#{field}", with: client.send(field.to_sym)
end

しかし、これは 1 つのタイプのフィールドに対してのみ、非常に単純なケースでのみ機能します (ご覧のとおり、私はスキップしclient_countryました)。

そのため、モデル属性をフォーム フィールドにマップするタスクの一般的な解決策はありません。フォーム フィールドのタイプが異なる可能性があり、マッピングがより複雑になる可能性があるためです。

于 2012-12-17T11:13:36.300 に答える