[transfer-dev] Re: Rollback 'save()' methods using Transaction advise()?

2009-01-20 Thread Mark Mandel

This is a really good question!

I've done similar things in my unit tests, by cheating a little, and
it worked a charm.

I can't seem the find the code... but the basics went something like
this (written in gmail, so errors will happen):

cfcomponent extends=frameworkYouUse.TestCase

cfscript
   //wrap everything in a transaction
   application.transferFactory.getTransaction().advise(this, ^test);
/cfscript

cffunction name=tearDown
  //dump the cache after every test
  cfset application.transferFactory.getTransfer().discardAll();
/cffunction

cffunction name=testFoo
  cfset assertTrue(...) /

  !--- rollback any processing that you've done ---
  cftransaction action=rollback /
/cffunction

/component

Using a combination of discardAll() and cftransaction you could roll
back your data and your cache quite happily.

There is an enhancement ticket for you to be able to start() and
stop() transactions on your own, but this way works pretty well as
well.

Mark

On Wed, Jan 21, 2009 at 11:44 AM, bimp bpa...@gmail.com wrote:

 I'm trying to devise a method of rolling back database operations in
 Transfer for unit testing purposes. After reading about leveraging the
 Transaction object advise() implementation (http://docs.transfer-
 orm.com/wiki/Transactions_and_Transfer.cfm), I tried creating a
 function called 'rollback()' that is wrapped by the advise() method
 along with all my other 'save()' functions.

 Then only in unit testing implementations, I would execute the
 'rollback()' function which does a cfthrow operation. I thought from
 the docs that this would effectively rollback all the database and
 Transfer operations but nothing happened. The cfthrow occurred but
 the database records still existed. Am I using the Transaction advise
 () function correctly?

 Is there a way to execute a tranasaction rollback using the advise
 implementation?

 Thanks.
 




-- 
E: mark.man...@gmail.com
W: www.compoundtheory.com

--~--~-~--~~~---~--~~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
transfer-dev group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~--~~~~--~~--~--~---



[transfer-dev] Re: Rollback 'save()' methods using Transaction advise()?

2009-01-20 Thread bimp

Mark, sweet that worked!!

Now correct me if I'm wrong. With this type of implementation of
rolling back, this assumes that in addition to the test functions
being advised by the Transaction class, that all the functions being
tested in the service, gateway, and business objects need to also be
advised as well for all this to work?

-Bim

On Jan 20, 4:54 pm, Mark Mandel mark.man...@gmail.com wrote:
 This is a really good question!

 I've done similar things in my unit tests, by cheating a little, and
 it worked a charm.

 I can't seem the find the code... but the basics went something like
 this (written in gmail, so errors will happen):

 cfcomponent extends=frameworkYouUse.TestCase

 cfscript
    //wrap everything in a transaction
    application.transferFactory.getTransaction().advise(this, ^test);
 /cfscript

 cffunction name=tearDown
   //dump the cache after every test
   cfset application.transferFactory.getTransfer().discardAll();
 /cffunction

 cffunction name=testFoo
   cfset assertTrue(...) /

   !--- rollback any processing that you've done ---
   cftransaction action=rollback /
 /cffunction

 /component

 Using a combination of discardAll() and cftransaction you could roll
 back your data and your cache quite happily.

 There is an enhancement ticket for you to be able to start() and
 stop() transactions on your own, but this way works pretty well as
 well.

 Mark



 On Wed, Jan 21, 2009 at 11:44 AM, bimp bpa...@gmail.com wrote:

  I'm trying to devise a method of rolling back database operations in
  Transfer for unit testing purposes. After reading about leveraging the
  Transaction object advise() implementation (http://docs.transfer-
  orm.com/wiki/Transactions_and_Transfer.cfm), I tried creating a
  function called 'rollback()' that is wrapped by the advise() method
  along with all my other 'save()' functions.

  Then only in unit testing implementations, I would execute the
  'rollback()' function which does a cfthrow operation. I thought from
  the docs that this would effectively rollback all the database and
  Transfer operations but nothing happened. The cfthrow occurred but
  the database records still existed. Am I using the Transaction advise
  () function correctly?

  Is there a way to execute a tranasaction rollback using the advise
  implementation?

  Thanks.

 --
 E: mark.man...@gmail.com
 W:www.compoundtheory.com
--~--~-~--~~~---~--~~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
transfer-dev group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~--~~~~--~~--~--~---



[transfer-dev] Re: Rollback 'save()' methods using Transaction advise()?

2009-01-20 Thread bimp


Mark,

Thanks again but one thing I noticed. The cftransaction
action=rollback works in that the newly inserted test record
doesn't appear post-test in my table. However the autoincrement ID
field of that same table does actually increase in my SQL Server
table.

I confirmed this by first running my unit test once without the
rollback and saw the test record with an id=5. I then put back the
rollback statement and ran my unit test 4 more times and each time, no
test record persisted which is good. Then I removed the rollback
statement, ran the test, and to my surprise, the id field was at id=10
instead of id=6.

Any advice? Thanks.

-Bim

On Jan 20, 5:43 pm, bimp bpa...@gmail.com wrote:
 Mark, sweet that worked!!

 Now correct me if I'm wrong. With this type of implementation of
 rolling back, this assumes that in addition to the test functions
 being advised by the Transaction class, that all the functions being
 tested in the service, gateway, and business objects need to also be
 advised as well for all this to work?

 -Bim

 On Jan 20, 4:54 pm, Mark Mandel mark.man...@gmail.com wrote:

  This is a really good question!

  I've done similar things in my unit tests, by cheating a little, and
  it worked a charm.

  I can't seem the find the code... but the basics went something like
  this (written in gmail, so errors will happen):

  cfcomponent extends=frameworkYouUse.TestCase

  cfscript
     //wrap everything in a transaction
     application.transferFactory.getTransaction().advise(this, ^test);
  /cfscript

  cffunction name=tearDown
    //dump the cache after every test
    cfset application.transferFactory.getTransfer().discardAll();
  /cffunction

  cffunction name=testFoo
    cfset assertTrue(...) /

    !--- rollback any processing that you've done ---
    cftransaction action=rollback /
  /cffunction

  /component

  Using a combination of discardAll() and cftransaction you could roll
  back your data and your cache quite happily.

  There is an enhancement ticket for you to be able to start() and
  stop() transactions on your own, but this way works pretty well as
  well.

  Mark

  On Wed, Jan 21, 2009 at 11:44 AM, bimp bpa...@gmail.com wrote:

   I'm trying to devise a method of rolling back database operations in
   Transfer for unit testing purposes. After reading about leveraging the
   Transaction object advise() implementation (http://docs.transfer-
   orm.com/wiki/Transactions_and_Transfer.cfm), I tried creating a
   function called 'rollback()' that is wrapped by the advise() method
   along with all my other 'save()' functions.

   Then only in unit testing implementations, I would execute the
   'rollback()' function which does a cfthrow operation. I thought from
   the docs that this would effectively rollback all the database and
   Transfer operations but nothing happened. The cfthrow occurred but
   the database records still existed. Am I using the Transaction advise
   () function correctly?

   Is there a way to execute a tranasaction rollback using the advise
   implementation?

   Thanks.

  --
  E: mark.man...@gmail.com
  W:www.compoundtheory.com
--~--~-~--~~~---~--~~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
transfer-dev group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~--~~~~--~~--~--~---



[transfer-dev] Re: Rollback 'save()' methods using Transaction advise()?

2009-01-20 Thread Bob Silverberg

That is the nature of identity fields in SQL Server.  There's nothing
you can do about it (short of running a DBCC CHECKIDENT command, which
you don't want to do), but it really should have no bearing on your
application.  You should not be counting on the value of your identity
fields being in sequence, as that's not what the feature is intended
to be used for.  It's just to generate a unique value for each record.

Cheers,
Bob


On Tue, Jan 20, 2009 at 9:32 PM, bimp bpa...@gmail.com wrote:


 Mark,

 Thanks again but one thing I noticed. The cftransaction
 action=rollback works in that the newly inserted test record
 doesn't appear post-test in my table. However the autoincrement ID
 field of that same table does actually increase in my SQL Server
 table.

 I confirmed this by first running my unit test once without the
 rollback and saw the test record with an id=5. I then put back the
 rollback statement and ran my unit test 4 more times and each time, no
 test record persisted which is good. Then I removed the rollback
 statement, ran the test, and to my surprise, the id field was at id=10
 instead of id=6.

 Any advice? Thanks.

 -Bim

 On Jan 20, 5:43 pm, bimp bpa...@gmail.com wrote:
 Mark, sweet that worked!!

 Now correct me if I'm wrong. With this type of implementation of
 rolling back, this assumes that in addition to the test functions
 being advised by the Transaction class, that all the functions being
 tested in the service, gateway, and business objects need to also be
 advised as well for all this to work?

 -Bim

 On Jan 20, 4:54 pm, Mark Mandel mark.man...@gmail.com wrote:

  This is a really good question!

  I've done similar things in my unit tests, by cheating a little, and
  it worked a charm.

  I can't seem the find the code... but the basics went something like
  this (written in gmail, so errors will happen):

  cfcomponent extends=frameworkYouUse.TestCase

  cfscript
 //wrap everything in a transaction
 application.transferFactory.getTransaction().advise(this, ^test);
  /cfscript

  cffunction name=tearDown
//dump the cache after every test
cfset application.transferFactory.getTransfer().discardAll();
  /cffunction

  cffunction name=testFoo
cfset assertTrue(...) /

!--- rollback any processing that you've done ---
cftransaction action=rollback /
  /cffunction

  /component

  Using a combination of discardAll() and cftransaction you could roll
  back your data and your cache quite happily.

  There is an enhancement ticket for you to be able to start() and
  stop() transactions on your own, but this way works pretty well as
  well.

  Mark

  On Wed, Jan 21, 2009 at 11:44 AM, bimp bpa...@gmail.com wrote:

   I'm trying to devise a method of rolling back database operations in
   Transfer for unit testing purposes. After reading about leveraging the
   Transaction object advise() implementation (http://docs.transfer-
   orm.com/wiki/Transactions_and_Transfer.cfm), I tried creating a
   function called 'rollback()' that is wrapped by the advise() method
   along with all my other 'save()' functions.

   Then only in unit testing implementations, I would execute the
   'rollback()' function which does a cfthrow operation. I thought from
   the docs that this would effectively rollback all the database and
   Transfer operations but nothing happened. The cfthrow occurred but
   the database records still existed. Am I using the Transaction advise
   () function correctly?

   Is there a way to execute a tranasaction rollback using the advise
   implementation?

   Thanks.

  --
  E: mark.man...@gmail.com
  W:www.compoundtheory.com
 




-- 
Bob Silverberg
www.silverwareconsulting.com

--~--~-~--~~~---~--~~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
transfer-dev group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~--~~~~--~~--~--~---