> On 4 May 2017, at 5:30 pm, Alexander Lunev <[email protected]> wrote:
> 
> DBD::Pg::db selectall_hashref failed: server closed the connection 
> unexpectedly. 

You tried to use a database handle that had been initialised in a previous 
process and then forked. As you’ve realised, this doesn’t work :-)

> 
> And if I try to use recipe with "has => dbh", somehow i need to get access to 
> $self->app in lib/PortMgr/Storage/PgSQL.pm, but it is not a Mojolicious 
> controller class, so i need to drag $dbh from lib/PortMgr.pm to 
> lib/PortMgr/Controller/Hw.pm to lib/PortMgr/Model/Hw.pm to 
> lib/PortMgr/Storage/PgSQL.pm? 
> 
> Is there any other solution? 


In general, if you find it difficult to test any of your classes in isolation, 
you’ve got some sort of code smell. In this case, the fact that the model 
instantiates it’s own database handle makes it hard to test, and causes this 
issue.

I’d suggest instantiating your database connection in the main application, and 
then passing it as a parameter to your model class. No singletons. Singletons 
aren’t always bad, but this one is :-) The model class should store it as an 
attribute:

package PortMgr::Model::Hw;

use Mojo::Base qw/-base/;

has ‘storage’;

…

As an added benefit, now you can test more easily:

my $db = Test::PortMgr::Storage::PgSQL->new(); # db handle to test database
my $model = PortMgr::Model::Hw->new(storage = >$db);

ok($model->get_hw(), ‘can get hw’);

Cheers,

        Justin


-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to