Mostafa Hussein
2013-May-02 00:07 UTC
[rspec-users] Trouble with Capybara and RSpec on a new model spec
I have searched a lot for a solution, but I could not find it! I am trying to make a rails application after watching Michael Hartl''s tutorial and when i fill data manually and submit it nothing happens and nothing records in the Mailers table and I am facing the following error: 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 The model file is: 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 Controller: 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 Integration test: 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 at 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 And the form: <% 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> -- Posted via http://www.ruby-forum.com/.
Vighnesh Rege
2013-May-02 00:26 UTC
[rspec-users] Trouble with Capybara and RSpec on a new model spec
On Wed, May 1, 2013 at 5:07 PM, Mostafa Hussein <lists at ruby-forum.com>wrote:> > before { visit mailers_path } >This should probably be before {visit new_mailer_path} mailers_path takes you to /mailers -> MailerController#index method Check out http://guides.rubyonrails.org/routing.html#paths-and-urls Vighnesh -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20130501/b51558eb/attachment.html>
Patrick J. Collins
2013-May-02 01:07 UTC
[rspec-users] Trouble with Capybara and RSpec on a new model spec
> it "should send a mail" do > expect { click_button submit}.to change(Mailer, :count).by(1) > endIn my opinion, capybara request specs are more for expressing the expectation of what a user should see... A user has no idea that clicking a button is going to increase some database table''s record count... So, I think a more useful test would be on the controller level, which would do something like: describe MailersController do describe "#create" do it "creates a mail record" do expect { post :create, valid_mailer_params }.to change { Mailer.count }.by(1) response.should redirect_to root_path end it "requires a valid attributes" do expect { post :create, invalid_mailer_params }.to_not change { Mailer.count } response.should render_template(''mailers/new'') end end end and then your request spec might end up just being something more simple like: describe "sending some mail" do it "takes the user back to the home page" do visit mailers_path 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 at example.com" fill_in "Description", with: "something to say" click_button "Send my Mail" expect(page.current_path).to eq(root_path) end end Patrick J. Collins http://collinatorstudios.com