手を抜いたモデル分離

MyApp::Webとか::APIとか::CLIとか作らないで
モデル触れてテストも出来てかつcliからも触れればいいならこんなんでもいいのだろうか

  • アプリ名

AutoTest

  • Userモデル
sub create_user {
    my ($self, $args) = @_;

    if ( validate_name($args->{name}) ) {
        $self->create($args);
        return 1;
    }
    return undef;
}

sub validate_name {
    my $name = shift;
    return $name =~ /^[a-zA-Z0-9_-]+$/;
}
  • コントローラ
# good sample begin
sub create_user :Local {
    my ( $self, $c ) = @_;

    if ($c->model('DBIC::User')->create_user($c->req->params) ) {
        return $c->stash(template => 'index.tt');
    }
    return $c->res->body('died');
}
#good sample end

#bad sample begin
sub create_user_bad :Local {
    my ( $self, $c ) = @_;

    my $name = $c->req->param('name');

    if ( validate($name) ) {
        $c->model('DBIC::User')->create({
            name => $name,#age,sex...
        });
    }
    else {
        return $c->res->body('died');
    }
}

sub validate_name {
    my $name = shift;
    return $name =~ /^[a-zA-Z0-9_-]+$/;
}
#bad sample end
  • テストコード
# begin test!
use_ok 'AutoTest::Schema';
my $yaml = 'autotest.yaml';
ok ( my $config = LoadFile($yaml) );
my $db = $config->{'Model::DBIC'}->{connect_info};
ok $db;
my $schema = AutoTest::Schema->connection(@$db);
ok $schema;

sub User { $schema->resultset('User') };
ok User;

my $user_ok = User->create_user({
    name => 'user_ok',
    age => 9,
    sex => 1,
});

is ($user_ok, 1, 'user create success');

my $user_ng = User->create_user({
    name => 'user ng false because space',
    age => 9,
    sex => 1,
});

is ($user_ng, undef, 'user create failed');


駄目なのかな。