In my opinion, you should rewrite your model with events.

Events-oriented model would be better for unit testing.

Alexandre

2009/10/22 Henning Glatter-Gotz <[email protected]>

>
> David,
>
> Thanks so much for pointing this out. At first glance this looks fantastic.
> I am more used to the xUnit family of testing frameworks because that is
> what I learned first and probably the reason I was a bit disappointed when
> reading the lime doc.
>
> In any case, I will definitely look into this. It does not solve all my
> problems, but it offers a whole bunch of useful things. And the rest is
> probably fixable by some refactoring of my code.
>
> Thanks
> Henning
>
> -----Original Message-----
> From: [email protected] [mailto:
> [email protected]] On Behalf Of david
> Sent: Thursday, October 22, 2009 3:49 PM
> To: [email protected]
> Subject: [symfony-users] Re: Unit testing with fake model classes
>
>
> Take a look at the lime plugin - which extends lime - it appears to
> support auto-creation of mock objects.
>
> http://webmozarts.com/2009/06/30/easy-unit-testing/
>
> On Thu, 22 Oct 2009 21:32:13 +0200, Henning Glatter-Gotz
> <[email protected]> wrote:
>
> > Thomas,
> >
> >
> > Thanks for your reply.
> >
> > Not sure if that would be practical:
> >
> >
> > Class MyClass
> >
> > {
> >
> >    :
> >
> >    :
> >
> >    public function doSomething($parameters)
> >
> >    {
> >
> >       :
> >
> >       //do a bunch of processing
> >
> >       :
> >
> >       $db = new MyModel();
> >
> >       :
> >
> >       // set model properties
> >
> >       :
> >
> >       $db->save();
> >
> >       :
> >
> >       return some_status;
> >
> >    }
> >
> >    :
> >
> > }
> >
> >
> > I would like to unit test the method doSomething. Problem is when
> > running in production mode I want it to construct an object of type
> > MyModel and actually save the data to the database.
> >
> > However, when running a unit test, I need the line
> >
> >
> > $db = new MyModel();
> >
> >
> > to be
> >
> >
> > $db = new MyModelFake();
> >
> >
> > I see two ways around this:
> >
> >
> > 1.       Pass in the model objects to be used either as a parameter to
> > the method or in the constructor. That way I can pass in the real thing
> > in production and a fake one in test mode. The problem with this is,
> > that if you have a lot of dependencies you end up passing in a tone of
> > objects. What if you need 3 instances of the same object? Just does not
> > seem very “clean”.
> >
> >
> >
> > 2.       Use a factory:
> > $db = ModelFactory->getMyModel();
> > then you could just pass in a reference to the factory and when you
> > construct the factory you tell it whether to construct real model
> > objects or fake ones.
> >
> >
> > PHPUnit has a really cool feature for this, it will create Mock objects
> > for you based on the real object, so there is not even any hand coding
> > necessary. Does Lime have something like this?
> >
> >
> > Thanks
> >
> > Henning
> >
> >
> > From: [email protected]
> > [mailto:[email protected]] On Behalf Of Thomas Rabaix
> > Sent: Thursday, October 22, 2009 3:05 PM
> > To: [email protected]
> > Subject: [symfony-users] Re: Unit testing with fake model classes
> >
> >
> > You can open a transaction and just rollback at the end.
> >
> > On Thu, Oct 22, 2009 at 8:58 PM, Henning Glatter-Gotz
> > <[email protected]> wrote:
> >
> > Hi,
> >
> >
> > I have a class I would like to unit/functional test that uses several
> > propel model classes that are used to write to the db (in this scenario
> > I am not getting any data out of the db). At this point I am not worried
> > about checking if data actually ends up in the db, I will rely on propel
> > to do its job.
> >
> >
> > So what I really want is the ability to inject fake model objects that
> > do not actually write to the database when I am running a unit test. The
> > fake model could be a class derived from the actual model where the save
> > method is overridden and simply returns 0 (or whatever other value I
> > want) and does nothing else.
> >
> >
> > The problem I am having is how to go about injecting the fakes. I don’t
> > really want to have to pass a reference of all model objects into my
> > object because I sometimes need multiple instances of the same class. So
> > what I would need is for the class I am testing to know which model
> > class to instantiate (MyModelReal or MyModelFake).
> >
> > To follow a good design principle of decoupling dependencies it would
> > probably be a good idea to not even have the model object construction
> > inside my object in the first place, but rather use a factory that knows
> > how to construct model objects and is environment aware (if running in
> > test it would construct fakes and otherwise the ‘real’ models).
> >
> >
> > I know of http://components.symfony-project.org/dependency-injection/.
> > It is not part of sf 1.2.x. Has anyone used this in sf 1.2.x?
> >
> > Does anyone have other suggestions on how to implement something like
> > this?
> >
> >
> > Thanks
> >
> > Henning
> >
> >
> >
> >
> >
> >
> >
>
>
> --
> Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
>
>
>
> >
>


-- 
Alexandre Salomé -- [email protected]

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"symfony users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/symfony-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to