Skip to main content

Reflector, Doubler and Unit Testing

Update: the latest versions of Reflector and Doubler are working well together.

I just noticed that Jay Flowers has released a version of the Doubler Add-In that works with the current Reflector by Lutz Roeder. I tried installing Doubler in a sub-directory under Reflector, but it failed to load, so I had to move it into the Reflector directory. The current version of Doubler generates test stubs with a mis-spelled attribute (Memeber instead of Member), but it will generate test stubs, interfaces, recording wrappers, mock objects, etc. It seems like it will be quite handy, with support for NUnit, MBUnit, etc. although Doubler forgets all of your settings every time you move to a new class. That is almost a deal breaker there, but at least you can select an assembly and generate all tests at once. I have to change the output language to c#, change the output path (or just build where the tool wants to go, and copy it), change the default test framework, and set "WithTestAttibutes" aka "With Test AttRibutes". As a good citizen of the open source community, I intend to submit patches for the spelling errors (one is found in namespace Doubler.Templates.UnitTest, file TestTemplate.cs, method VisitTestGenerateMember). I will also look into the configuration issue when I get time, although I know that the path C:\Temp is hard-coded into ReflectorDoubler.

The only thing that bugs me about Reflector is that the code has a time bomb in it, and I am forced to upgrade Reflector every few months (or maybe lie to Windows about the current date). I am sure he does it to reduce bug reports from stale code, and maybe to force developers to try out his new code, but it means that I may have to upgrade any add-ins as well, and I may loose my tool set until critical add-ins are updated. I know, doubler is open source (Reflector is NOT!) and if I have enough time, I could maybe build it, but the doubler project has some HUGE dependencies, and has very elaborate and complicated directory structure. I tried building it from the Google Code repository, but Lutz had changed parts of his plug-in interface, and I did not have time to bother with it. I knew better than to fall into that time trap.

Speaking of time traps, I think that I am doing better at managing my time. I have learned to write clean and simple code where possible, and I am less obsessed with optimizing code that might run once a month. Code that is run rarely needs to be very readable, and easily maintained (aka fixed).

Comments

Anonymous said…
I only needed to update my add-ins when moving from Reflector 4.2 to 5.0. For all other versions the updated worked fine.

Popular posts from this blog

Castle ActiveRecord with DetachedCriteria

My current development environment is Visual Studio Express C# Edition (read that as free ), Castle ActiveRecord's latest svn trunk(usually within a few days), and NHibernate svn trunk. As of NHibernate version 1.2.0, there is a very cool new class out there ... DetachedCriteria. This class lets you set all of your Castle relational attributes like BelongsTo, HasMany, etc. as lazy fetch, and over-ride this for searches, reports, or anytime you know ahead of time that you will be touching the related classes by calling detachedCriteria.SetFetchMode(..., FetchEnum.Eager). As a good netizen, I have tried to contribute to NHibernate and Castle ActiveRecord even if only in the smallest of ways . Oh yeah, I tried mapping to a SQL VIEW, and it worked GREAT! I received a comment after my last post, indicating that there is a better way, and I am sure of it, but the view guaranteed that I only have one database request for my dataset. NHibernate was wanting to re-fetch my missing as

Castle ActiveRecord with Criteria and Alias

Update May 25, 2007: ActiveRecord now supports DetachedCriteria, which eliminates the need for the SlicedFindAll that I wrote below. It is nice when a library moves to add support for such commonly needed functions. So in summary, use Detached criteria instead of the code below. It is still a nice example of using NHibernate sessions. I have a history log, where each history record "belongs to" a service record. I have to treat this as a child-to-parent join, since some children are orphans. I wanted to use the FindAll(Criteria), but I wanted the option to have optional criteria, orders and aliases. My solution was to create an ARAlias class to represent an Associated Entity and an alias, and then build an ARBusinessBase class with the following method: public static T[] SlicedFindAll(int firstResult, int maxResults, Order[] orders, ARAlias[] aliases, params ICriterion[] criteria) { IList list = null; ISessionFactoryHolder holder = ActiveRecordMediator.GetSessionF

Castle ActiveRecord calling a Stored Procedure

Update: I have contributed patch AR-156 that allows full integration of Insert, Update and Delete to ActiveRecord models . If you've been reading my blog lately, you know that I have been seriously testing the Castle ActiveRecord framework out. I really love it, but I have an existing Microsoft SQL Server database with many stored procedures in it. I have tested the ActiveRecord model out, and I am sure that I will learn enough to be able to use it for standard CRUD (create, read, update, delete aka. insert, select, update, delete) functionality. BUT ... If I really want to integrate with my existing billing procedures, etc, I will have to be able to call stored procedures. I have taken two approaches ... write the ARHelper.ExecuteNonQuery(targetType, dmlString) method that gets a connection for the supplied type, executes dmlString, and closes it. write the ARHelper.RegisterCustomMapping(targetType, xmlString) method that allows me to add mappings that refer to my auto-gener