Capybara和RSpec在新型号规格上遇到麻烦

时间:2013-05-01 14:04:34

标签: ruby-on-rails ruby-on-rails-3 rspec ruby-on-rails-3.2 capybara

我已经搜索了很多解决方案,但我找不到它!我在观看Michael Hartl的教程之后尝试制作一个rails应用程序,当我手动填充数据并提交时没有任何反应,Mailers表中没有任何记录,我面临以下错误:

Failures:

  1) Mailer pages mail us with valid information should send a mail
     Failure/Error: expect { click_button submit}.to change(Mailer, :count).by(1)
       count should have been changed by 1, but was changed by 0
     # ./spec/requests/mailer_pages_spec.rb:31:in `block (4 levels) in <top (required)>'

Finished in 0.89134 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/requests/mailer_pages_spec.rb:30 # Mailer pages mail us with valid information should send a mail

Randomized with seed 17352

模型文件是:

class Mailer < ActiveRecord::Base
  attr_accessible :company_name, :contact_name, :address, :telephone, :email, :description
  before_save { |mailer| mailer.email = mailer.email.downcase }
  validates :company_name, length: { maximum: 50 }
  validates :contact_name, presence: true, length: { maximum: 40 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }
end

控制器:

class MailersController < ApplicationController

  def new
    @mailer = Mailer.new
  end

  def create
    @mailer = Mailer.new(params[:mailer])
    if @mailer.save
      redirect_to root_path
    else
      render 'new'
    end
  end
end

集成测试:

require 'spec_helper'

describe "Mailer pages" do

 subject { page }


 describe "mail us" do

     let(:submit) { "Send my Mail"}
     before { visit mailers_path }


     describe "with invalid information" do
       it "should not send a mail" do
         expect { click_button submit }.not_to change(Mailer, :count)
         end
     end

     describe "with valid information" do
       before do
         fill_in "Company name", with: "Mailer Company"
         fill_in "Contact name", with: "Mailer Contact"
         fill_in "Address",      with: "Mailer Address"
         fill_in "Telephone",    with: "123-456-789"
         fill_in "Email",        with: "mailer@example.com"
         fill_in "Description",  with: "something to say"
       end

       it "should send a mail" do
         expect { click_button submit}.to change(Mailer, :count).by(1)
       end  
     end
   end
 end

形式:

<% provide(:title , 'Mail Us') %>
<h1>Mail Us</h1>
<div class="row">
    <div class="span6 offset3 hero-unit">

<%= form_for(@mailer) do |f| %>
    <%= f.label :company_name %>
    <%= f.text_field :company_name %>

    <%= f.label :contact_name %>
    <%= f.text_field :contact_name %>

    <%= f.label :address %>
    <%= f.text_field :address %>

    <%= f.label :telephone %>
    <%= f.text_field :telephone %>

    <%= f.label :email %>
    <%= f.text_field :email %>

    <%= f.label :description %>
    <%= f.text_field :description %>

    <%= f.submit "Send my Mail", class: "btn btn-large btn-primary"%>
<% end %>
</div>
</div>

&lt;%= debug(params)如果Rails.env.development? %&gt; 添加到应用程序布局中,我看到动作是新的没有创建,是什么导致问题?等待帮助

2 个答案:

答案 0 :(得分:2)

你的创建动作指定如果保存了对象,你应该被重定向到root_path,否则它应该再次渲染表单(渲染'new')。

因此,如果表单再次呈现,则表示验证失败并且您的Mailer对象尚未保存。将以下内容添加到表单中以查看错误:

<%= form_for(@mailer) do |f| %>
  <% @mailer.errors.full_messages.each do |msg| %>
    <p><%= msg %></p>
  <% end %>
  ...
<% end %>

答案 1 :(得分:0)

问题解决了:)我没有在路线文件中添加资源:邮件程序:D