Forum: RSpec Specting controller post

Posted by Stephen Smithstone (Guest)
on 2010-02-02 11:32
(Received via mailing list)
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
Posted by J. B. Rainsberger (Guest)
on 2010-02-02 13:28
(Received via mailing list)
On Tue, Feb 2, 2010 at 04:24, Stephen Smithstone <ssmithstone@me.com> 
wrote:

> A bit stuck here being new to ruby and rspec

Welcome. I hope you like the experience. Good news: we've seen what
you've done a thousand times and so it's quite easy to explain.

> in my controller
>   expected: ({:title=>"Mr", :firstname=>"Ernest", :lastname=>"Burke",
> :email=>"rgarrett@blogtag.info"})
>        got: ({"title"=>"Mr", "lastname"=>"Burke", "firstname"=>"Ernest",
> "email"=>"rgarrett@blogtag.info"})
>
> is there a way to specify to use symbols instead of the strings as keys, as
> I dont want to be doing
>
> :client => { "title" => client.title , ............ }
>
> as the client model may change over time

Try Client.should_receive(:new).with(client.attributes), because the
#attributes method turns a model into a Hash of symbol to value. It
uses string keys instead of symbol keys, but that shouldn't hurt you.

Good luck.
--
J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
http://blog.thecodewhisperer.com
Diaspar Software Services :: http://www.diasparsoftware.com
Author, JUnit Recipes
2005 Gordon Pask Award for contribution to Agile practice :: Agile
2010: Learn. Practice. Explore.
Posted by Stephen Smithstone (Guest)
on 2010-02-02 13:53
(Received via mailing list)
cheers for the response , seem that attributes is missing from hash on 
my
system

all i did was the blueprint with a standard hash

client = { :title => "Mr }

client.attributes

NoMethodError: undefined method `attributes' for {:title=>"Mr"}:Hash

is attributes added on by rails ?

if so my setup must be wrong
Posted by Stephen Smithstone (Guest)
on 2010-02-02 14:19
(Received via mailing list)
seems the blueprint is not inheriting from active record base so no
#attributes on the class, have to look for another solution or pass in 
some
parameters my self

On 2 February 2010 12:26, Stephen Smithstone
Posted by Nicolás Sanguinetti (Guest)
on 2010-02-02 14:27
(Received via mailing list)
The problem is that you're passing a hash with symbols as keys, and
rails takes the params and converts it to a HashWithIndifferentAccess,
which actually stores the keys as strings.

One thing you might try to solve your problem is do this:

it "should create new client" do
  client = Client.plan.with_indifferent_access
  Client.should_receive(:new).with(client)
  post 'create' , :client => client
end

I guess that will probably solve it.

On an unrelated note—and here's to opening a huge can of worms :)—I
usually dislike stubbing/mocking to do these simple tests. I tend to
like testing more the behavior of my controllers, so for a valid
create, I would write this test:

it "adds a new client" do
  lambda { post :create, :client => Client.plan }.should
change(Client, :count).by(1)
end

Since this doesn't rely on the implementation (calling
Client.new(params) — which might change to
current_user.clients.new(params), and maybe some business logic is
added along the way and it turns into current_user.add_client(params)
at some point), it tells me that the action, provided valid
parameters, is working, and at the same time will resist a
refactoring.

(This is considering your action is a "standard" create action for a
rails controller)

But again, this is *my* usual approach, there are good reasons both in
favor of not mocking and in favor of mocking the behavior of your
models. I just like the ones in favor of not mocking a bit more :)

Cheers

On Tue, Feb 2, 2010 at 10:26 AM, Stephen Smithstone
Posted by Nicolás Sanguinetti (Guest)
on 2010-02-02 14:32
(Received via mailing list)
On Tue, Feb 2, 2010 at 10:54 AM, Stephen Smithstone
<stephen.smithstone@gmail.com> wrote:
> seems the blueprint is not inheriting from active record base so no
> #attributes on the class, have to look for another solution or pass in some
> parameters my self

Model#plan will just return a hash of attributes, using your
blueprint. If you want an instance of the model, you can use
Model#make, or Model#make_unsaved.

(This is assuming you're using Machinist, given the api you're using)
Posted by Stephen Smithstone (Guest)
on 2010-02-02 14:58
(Received via mailing list)
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
Posted by J. B. Rainsberger (Guest)
on 2010-02-02 15:32
(Received via mailing list)
On Tue, Feb 2, 2010 at 07:26, Stephen Smithstone
<stephen.smithstone@gmail.com> wrote:

> cheers for the response , seem that attributes is missing from hash on my
> system

You'll find #attributes on ActiveRecord::Base, and not Hash.

Try this:

it "should create new client" do
    // creates me a hash of generated values using Foregey
    client = Client.plan
    // specify that I should be creating a new client with the hash
values from client
    Client.should_receive(:new).with(client.attributes)
    //post to the server
    post 'create' , :client => client
end
--
J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
http://blog.thecodewhisperer.com
Diaspar Software Services :: http://www.diasparsoftware.com
Author, JUnit Recipes
2005 Gordon Pask Award for contribution to Agile practice :: Agile
2010: Learn. Practice. Explore.
Posted by J. B. Rainsberger (Guest)
on 2010-02-02 15:33
(Received via mailing list)
On Tue, Feb 2, 2010 at 09:18, J. B. Rainsberger 
<jbrainsberger@gmail.com> wrote:
> On Tue, Feb 2, 2010 at 07:26, Stephen Smithstone
> <stephen.smithstone@gmail.com> wrote:
>
>> cheers for the response , seem that attributes is missing from hash on my
>> system
>
> You'll find #attributes on ActiveRecord::Base, and not Hash.

I responded too soon. Ignore my response. I don't know Machinist, and
so I can't help you.
--
J. B. (Joe) Rainsberger :: http://www.jbrains.ca ::
http://blog.thecodewhisperer.com
Diaspar Software Services :: http://www.diasparsoftware.com
Author, JUnit Recipes
2005 Gordon Pask Award for contribution to Agile practice :: Agile
2010: Learn. Practice. Explore.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.