Ginty wrote:
>> > No need to pass any blocks about as arguments (I really hate that, but
>> > that could just be me).
>> Er...what's wrong with blocks? I don't get the problem, and anyway,
>> they're part of idiomatic Ruby...
> Blocks as wrappers, iterators, etc....very nice, blocks as
> arguments....meh.
Uh, no. Passing closures (blocks) as arguments is one feature that
makes Ruby very powerful. You'll have to do better than "meh" to
explain why you're choosing not to use a key Ruby feature, at least if
you want people to take you seriously and use your software.
Haha, yeah you've probably taken me down a path here I didn't really
mean to go down.
Marnen says: I didn't lead you down ...
Yeah I know.
Bottom line, this to me is ugly:
u.email {|a| "#{a.first_name}.#{a.last_name}@example.com" }
this is more elegant in it's simplicity:
:email => "#{first_name}.#{last_name}@example.com"
Personal preference.
>> > I just never really felt in control of this from the other solutions I
>> > tried (admittedly I haven't tried all of the ones on your list) and I
>> > feel much happier writing tests when I know now exactly when and how
>> > secondary instances are being generated.
>> What's the point of factories that don't handle associations? That
>> seems like a huge disadvantage. Part of the reason that I use factories
>> is so I can just say Widget.make and get a fully viable Widget object,
>> complete with required fields and associations. Otherwise, why bother?
> Agreed not much point to that.
> I didn't say that it doesn't provide any behind the scenes magic to
> handle them. In your factory definition for the widgets association
> you would either just call the create method for the other item, or if
> you want something more elaborate (all widgets with the exact same
> parent for example) your own helper method.
> Here's the example from the README for a user and an address factory,
> and how you relate them.
> def user
> # Define attributes via a hash, generate the values any way you want
> define :name => "Jimmy",
> # An 'n' counter method is available to help make things
> unique
Does it work with Faker?
Yeah it'll work with anything like that, you're just defining a
regular method, require what you will.
> :email => "jimmy#...@home.com",
> :role => :user,
> # Call your own helper methods to wire up your
> associations...
Does :user just get passed to a helper, or what?
Good point, maybe a bad example, :user was just the value I pass to my
user.role= method. It doesn't refer to the user factory, model or
otherwise. Could equally have been :admin or what have you. I'll
change this in the docs.
And what didn't you feel in control of with Machinist or Factory Girl?
Machinist in particular just uses the usual Rails association
mechanisms.
For me they are too heavy, too much magic at times (admittedly I am a
Factory Girl guy), I need to think too much about how to create an
association if I want anything other than a randomly generated one,
and ultimately I just don't like the syntax. The combination of these
things has made me feel that I've never really 'flowed' with this
aspect of writing my tests for want of a better description.
I said in the blog that Miniskirt was a real revelation to me as it
showed me that these factory helpers don't need to do much, I don't
quite understand now why some of them are so big under the hood, but
Miniskirt didn't hit the syntax aspect for me either.
So Cranky is now my factory of choice, it feels good, very good, and I
don't think that I have abnormal tastes. So I've packaged it up should
others like it to. So if you do cool, if you don't that's cool to,
we're not exactly short of choice here.