Hi guys, I don''t know how to write an spec for a view template with two or more forms. The follow content corresponds to the file named home.html.haml !!! 5 = form_for(:session, :url => sessions_path) do |f| .field = f.label :email = f.text_field :email .field = f.label :password = f.password_field :password .actions = f.submit "Sign in" = form_for(@user) do |f| .field = f.text_field :fullname .field = f.text_field :email .field = f.password_field :password .actions = f.submit "Sign up" The _spec file (home.html.haml_spec.rb) content is: require ''spec_helper'' describe "pages/home.html.haml" do describe ''sign in form'' do before(:each) do render end it ''should render a form to create a new session'' do rendered.should have_selector("form", :method => "post", :action => sessions_path) do | form| form.should have_selector("input", :type => "submit", :value => "Sign in") end end end # describe: ''sign in form'' describe ''sign up form'' do let(:user) {mock_model("User").as_new_record.as_null_object} before(:each) do assign(:user, user) render end it ''should render a form to create a new user'' do rendered.should have_selector("form", :method => "post", :action => users_path) do |form| form.should have_selector("input", :type => "submit", :value => "Sign up") end end end # describe: ''sign up form'' end As this, the second example passes and the first doesn''t. Rspec shows the message "undefined method model_name for Nilclass:Class". If I delete the second form, the first example passes. Anybody can tell me how to use have_selector properly? thanks a lot.
David Chelimsky
2011-Nov-15 03:26 UTC
[rspec-users] How to write view specs with multiple forms
On Nov 8, 2011, at 12:53 AM, emadridm wrote:> Hi guys, > > I don''t know how to write an spec for a view template with two or more > forms. The follow content corresponds to the file named home.html.haml > > !!! 5 > = form_for(:session, :url => sessions_path) do |f| > .field > = f.label :email > = f.text_field :email > .field > = f.label :password > = f.password_field :password > .actions > = f.submit "Sign in" > = form_for(@user) do |f| > .field > = f.text_field :fullname > .field > = f.text_field :email > .field > = f.password_field :password > .actions > = f.submit "Sign up" > > The _spec file (home.html.haml_spec.rb) content is: > > require ''spec_helper'' > > describe "pages/home.html.haml" do > > describe ''sign in form'' do > > before(:each) do > render > end > > it ''should render a form to create a new session'' do > rendered.should have_selector("form", > :method => "post", > :action => sessions_path) do | > form| > form.should have_selector("input", :type => "submit", :value > => "Sign in") > end > end > > end # describe: ''sign in form'' > > describe ''sign up form'' do > > let(:user) {mock_model("User").as_new_record.as_null_object} > > before(:each) do > assign(:user, user) > render > end > > it ''should render a form to create a new user'' do > rendered.should have_selector("form", > :method => "post", > :action => users_path) do |form| > form.should have_selector("input", :type => "submit", :value > => "Sign up") > end > end > > end # describe: ''sign up form'' > > end > > As this, the second example passes and the first doesn''t. Rspec shows > the message "undefined method model_name for Nilclass:Class". If I > delete the second form, the first example passes. > > Anybody can tell me how to use have_selector properly?You''ve got to scope the forms so it can find both. Something like: .sign-in-form = form_for(:session, :url => sessions_path) do |f| ... .sign-up-form = form_for(@user) do |f| Now the spec can be more specific: rendered.should have_selector(".sign-in-form form", .... rendered.should have_selector(".sign-up-form form", .... HTH, David