[Catalyst] Mocking for Catalyst testing

Stuart Watt swatt at infobal.com
Sun Jan 17 22:07:16 GMT 2010


OK, forgive me for this - it's probably a hang-over from expectations I had from using Spring. 

Basically, we have two applications, the job of one is to provide control over a several instances of the second, as well as managing a job queue which updates the databases used by the second. Since we are using very long jobs, we have a web service to service that looks after the job queue, which in a live application will be running typically on a second server. Our task is to provide some kind of round-trip tests of as much as we can without having our testing framework script updates to live web servers. To cap it all, this is on Windows. I'm trying to do as much of a system test as is possible without actually installing, starting, and stopping Windows services. 

What I wanted to be able to do was mock out the remote job queue web service, so at least I could check out that the front end render stuff without to put an entire web server temporarily in place. Basically, I'd hoped to replace the model that implements the web service and check that the right stuff goes in and out. 

I managed to test the remoteness independently, by virtue of mocking LWP::UserAgent and FCGI with some fakery. Moose seems to be helping; I had already got an abstract class for the remoting system, but since that's better as a role, this does seem to be something I can test with something that replaces the web bridge.

You're right, of course, finer grained testing would probably be better at picking up most of the issues. And I probably do need to do the whole system test thing, and maybe I just need to confront Win32::Process and just spin up a test web service for this. Not what I'd wanted, but probably the right thing to do.

All the best
Stuart



On 2010-01-17, at 3:23 PM, Tomas Doran wrote:

> 
> On 17 Jan 2010, at 18:36, Stuart Watt wrote:
> 
>> On 2010-01-16, at 10:31 PM, Tomas Doran wrote:
>> 
>>> I tend to just use Moose directly to construct mock classes for me:
>> 
>> Things are improving, t0m. I tried
>> 
>> use Class::MOP;
>> use Class::MOP::Class;
>> my $meta_refreshes = Class::MOP::Class->create('ARMAdmin::Model::Refreshes');
>> $meta_refreshes->add_method('get_profiles' => sub { die("Failed to get profiles"); });
>> 
>> Then I start the app in the test framework. I'm just after getting the get_profiles mocked method called here, later I want it to return values I can test in the generated page.
>> 
>> However, Catalyst then calls:
>> 
>> Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
> 
> Right, hang on.. Why are you mocking things and then loading the entire application?
> 
> Usually you either run the full app for system testing (with test config that points at a test DB or whatever), or you mock _lots of stuff_ (like the context class, the request and response) and unit test one component..
> 
> Trying to mangle methods then load the full app won't work..
> 
> If you reaaaaalllly need to do this - use Catalyst::Test 'MyApp', then manipulate the class after catalyst has loaded it (e.g my $meta = MyApp::Model::Foo->meta; $meta->remove_method('bar'); $meta->add_method('bar' => sub { die("New bar") }); )
> 
> but I'd not recommend it..
> 
> Cheers
> t0m
> 
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
> 
> --
> This message was scanned by ESVA and is believed to be clean.
> Click here to report this message as spam.http://antispam.infobal.com/cgi-bin/learn-msg.cgi?id=F27212807F.6322C
> 




More information about the Catalyst mailing list