Thread POST-Requests mit beliebigem Content-type beim Testen von Catalyst-Applikationen (1 answers)
Opened by skirnir at 2009-06-12 14:17

skirnir
 2009-06-12 14:17
#122482 #122482
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin gerade dabei, Tests für eine Catalyst-Applikation zu schreiben. Diese hat die Eigenart, dass sie Logins in einem REST-Controller handelt und die Action als Login-Request gerne ein "POST" mit Content-type "application/json" hätte, so dass Login und Passwort in einem JSON-Objekt im Body der POST-Request übermittelt werden müssen.
Analog zum Beispiel in Jonathan Rockways Catalyst-Buch (S. 165) habe ich also die folgende Fake-Datenbank mit log_in Methode geschrieben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package MyApp::Test::Database::Live;

use strict;
use warnings;

use MyAppDB;
use MyApp::Model::MyAppDB;
use Directory::Scratch;
use YAML qw( DumpFile );
use FindBin qw( $Bin );
use Digest::SHA1 qw( sha1_hex );
use Catalyst::Test "MyApp";
use HTTP::Request;

use base 'Exporter';
our @EXPORT = qw /schema log_in /;
my $schema;
my $config;

BEGIN {
my $tmp = Directory::Scratch->new;
my $db = $tmp->touch('db');
my $dsn = "DBI:SQLite:$db";
$schema = MyAppDB->connect($dsn);
$schema->deploy;
$config = "$Bin/../myapp_Local.yml";
DumpFile($config, { 'MyApp::Model::MyAppDB' => { connect_info => [$dsn]}});
}

sub schema { $schema };

sub log_in {
my $mech = shift;

my $dummy = { 'Content-type' => 'application/json' };
my $person = schema()->resultset('MyAppDB::User')->create({
login => 'testuser',
password => sha1_hex('testing'),
mail => 'testuser@mydomain.de',
first_name => 'Max',
last_name => 'Mustermann',
company => 'MyCompany',
customer_id => 'custid',
});
my @ar;
push @ar, $dummy;
my $req = HTTP::Request->new('POST', 'http://localhost/rest/login/login', \@ar, '{ "login": "testuser", "password": "testing"}'. "\n" );

request($req);
}

END { unlink $config };

1;


Da Test::WWW::Mechanize::Catalyst nur "einfache" POSTs zulässt, bin ich den Umweg über Catalyst::Test gegangen. Ich hatte gehofft, dass ich die Beschränkung auf "host" als einzigen zulässigen Header-Parameter umgehen könnte, habe ich vorher ein HTTP::Request-Objekt selbst gebaut.
Die Request aus dem Beispielcode funktioniert einwandfrei, wenn ich sie mit LWP::UserAgent an einen "echten" Server schicke, aber im Kontext meiner Tests kommt der Body nicht an (Fehlermeldung der REST-Action: "I would have deserialized, but there was nothing in the body!")

Kann mir vielleicht jemand sagen, wie ich eine Catalyst-Applikation mit "selbstgebauten" Requests testen kann?

P.S.: Als letzte Möglichkeit bliebe natürlich, den Login-Prozess derart umzuschreiben, dass einfach eine Form submittet würde, aber mir geht's inzwischen auch ums Prinzip.

View full thread POST-Requests mit beliebigem Content-type beim Testen von Catalyst-Applikationen