0

Rails 3.2.6

この記事で提案されているように、連絡先コントローラーとフォームを設定しました:http: //matharvard.ca/posts/2011/aug/22/contact-form-in-rails-3/

私のMessageモデルクラス:

class Message
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :message_body

  # validations are here...

  def initialize(attributes = {})
      attributes.each do |name, value|
      send("#{name}=", value)
      end
  end

  def persisted?
      false
  end
end

Contact Controller:_

def create
    @message = Message.new(params[:message])

    if @message.valid?
        ContactMailer.new_message(@message).deliver
        redirect_to(root_path, :notice => "Message was successfully sent.")
    else
        render :new
    end
end

私のrspecコントローラーテスト:

describe "POST create" do
    context "with valid information" do
      let (:message) { FactoryGirl.build(:message) }
      it "creates a new message" do
        post :create, params: message
        assigns(:message).should eq(message)
    end
  end
end

message変数viaがnilでないことを確認したletので、FactoryGirlがその仕事をしています。

テスト結果:

ContactController POST create with valid information creates a new message
 Failure/Error: post :create, params: message
 NoMethodError:
   undefined method `each' for nil:NilClass
 # ./app/models/message.rb:14:in `initialize'
 # ./app/controllers/contact_controller.rb:8:in `new'
 # ./app/controllers/contact_controller.rb:8:in `create'
 # ./spec/controllers/contact_controller_spec.rb:22:in `block (4 levels) in <top (required)>'

私はそれがMessageinitialize方法のために失敗していることを知っています。しかし、なぜそれがnilを初期化しているのかは今では確信しています。開発環境でフォームをテストすると、正常に機能しているように見えます。ご協力いただきありがとうございます。

4

2 に答える 2

0

次のように、明示的な名前でメッセージを渡す必要があると思います。

it "creates a new message" do
    post :create, :message => message
    assigns(:message).should eq(message)
end

または短いスタイル:

post :create, message: message

したがって'message'、paramsハッシュにキーがあります

params[:message] = ... # here's your message

そうしないと、キーが入力されずparamsparams[:message]リターンがゼロになります。

于 2012-08-17T00:36:04.177 に答える
0

postの hash オプションの値としてハッシュを渡す必要がありました。そのようです:

message_attributes = FactoryGirl.attributes_for(:message)
post :create, message: message_attributes

Messageテストで 2 つのメッセージを比較するには、モデルを次のように変更する必要がありました。

attr_accessor :attributes, :name, :email, :message_body
def initialize(attributes = {})
    if not attributes.nil?
        attributes.each do |name, value|
            send("#{name}=", value)
        end
    end
    @attributes = attributes
end

したがって、最終的な合格テストは次のようになります。

it "creates a new message" do
    message_attributes = FactoryGirl.attributes_for(:message)
    post :create, message: message_attributes
    assigns(:message).attributes.symbolize_keys.should eq(message_attributes)
end

これが最善の解決策であったかどうかはわかりませんが、成功するテストを作成し、コントローラーがメッセージを正しく作成していることを確認します。

于 2012-08-17T20:14:09.717 に答える