忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/23 23:33 |
Symfony1.4 11日目その2
前回の続き


http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/11
前回のテストは、フォームにどんな適当な値があっても気にしないというあまり意味のないテストでした。
当然ですが実際にフォームの投稿が有効かどうかを確認するテストを行うことができます。

まずはフォームテスター。
コードだけ書いてあって何処に挿入するの?って感じですが、click()の直後に挿入します。たぶん。

/test/functional/frontend/jobActionsTest.php 
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
<?php
//記事新規作成
$browser->info('3 - Post a Job page')->
  info('  3.1 - Submit a Job')->
 
  get('/job/new')->
  with('request')->begin()->
    isParameter('module', 'job')->
    isParameter('action', 'new')->
  end()->
 
  click('Preview your job', array('job' => array(
    'company'      => 'Sensio Labs',
    'url'          => 'http://www.sensio.com/',
    'logo'         => sfConfig::get('sf_upload_dir').'/jobs/sensio-labs.gif',
    'position'     => 'Developer',
    'location'     => 'Atlanta, USA',
    'description'  => 'You will work with symfony.',
    'how_to_apply' => 'Send me an email',
    'email'        => 'for.a.job@example.com',
    'is_public'    => false,
  )))->
  
    with('form')->begin()->
      hasErrors(false)->
    end()->
 
  with('request')->begin()->
    isParameter('module', 'job')->
    isParameter('action', 'create')->
  end()
;

>php test/functional/frontend/jobActionsTest.php
> 3 - Post a Job page
>   3.1 - Submit a Job
# get /job/new
ok 1 - request parameter module is job
ok 2 - request parameter action is new
# post /job
not ok 3 - the submitted form is valid.
#     Failed test (C:\xampp\php\PEAR\symfony\test\sfTesterForm.class.php at line 95)
#            got: true
#       expected: false
ok 4 - request parameter module is job
ok 5 - request parameter action is create

なにやらエラーが出ました。
hasErrors(false)でエラーが出ないことを期待したのですが、実際はエラーが出ましたよ、ということです。
hasErrors(false)->debug()で詳細を確認することができます。

Form debug
Submitted values: array (  'category_id' => '93',  'company' => 'AAAAASensio Labs',  'url' => 'http://www.sensio.com/',  'position' => 'Developer',  'location'=> 'Atlanta, USA',  'description' => 'You will work with symfony to develop websites for our customers.',  'how_to_apply' => 'Send me an email',  'is_public' => false,  'email' =>
'for.a.job@example.com',  'id' => '',  'logo' => 'symfony/web/uploads/jobs/sensio-labs.gif',)
Errors: type [Required.]

なにか必須項目が足りないというエラーが出てきました。
どの項目が足りないかまではわからないようです。
必須項目は現在'Type'、'Company'、'Position'、'Location'、'Description'、'How to apply?'、'Email'となっています。
'Type'がありませんね。
追加してみましょう。

Submitted values: array (  'category_id' => '113',  'company' => 'Sensio Labs', 'url' => 'http://www.sensio.com/',  'position' => 'Developer',  'location' => 'Atlanta, USA',  'description' => 'You will work with symfony to develop websites for our customers.',  'how_to_apply' => 'Send me an email',  'is_public' => false,  'email' => 'for.a.job@example.com',  'id' => '',  'logo' => 'symfony/web/uploads/jobs/sensio-labs.gif',  'type' => 'Freelance',)
Errors: type [Invalid.]

およ?
しかも詳細はわかりません。

with('form')ブロックのかわりにwith('response')->debug()を入れると返ってきた出力をそのまま確認できます。

<th><label for="job_type">Type</label></th>
<td><ul class="error_list"><li>Invalid.</li></ul>

追加したtypeが正しくないようです。何故?
よく見るとtypeの値として有効なのは'Freelance'ではなく'freelance'でした。
まあ、これはこれできちんとバリデータが動作している証左になるでしょう。

で、ここまで書いて気が付いたのですが、もしかしてさっきの'Errors: type [Required.]'って、エラーの内容が'必須'という意味ではなく、'type'フィールドが'必須'って意味じゃねーの?

'company'をコメントアウトしてみる。
Errors: company [Required.]
うわあ、やっぱり。

さて、ブラウザからフォームを投稿するとその後はフォームの管理画面に移動するようになっていました。
そのような動作を追いかけることも当然できます。

/test/functional/frontend/jobActionsTest.php
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
<?php
//記事新規作成
$browser->info('3 - Post a Job page')->
  info('  3.1 - Submit a Job')->
 
  get('/job/new')->
  with('request')->begin()->
    isParameter('module', 'job')->
    isParameter('action', 'new')->
  end()->
 
  click('Preview your job', array('job' => array(
    (中略)
  )))->
  
  with('request')->begin()->
    isParameter('module', 'job')->
    isParameter('action', 'create')->
  end()->
  
  with('response')->isRedirected()->
    followRedirect()->
 
  with('request')->begin()->
    isParameter('module', 'job')->
    isParameter('action', 'show')->
  end()
;

フォームを投稿した画面でjobモジュールのcreateアクションが起動し、そのレスポンスはリダイレクトになっており、それを追いかけた先ではjobモジュールのcreateアクションが起動しますよ、というテストです。

>php test/functional/frontend/jobActionsTest.php
> 3 - Post a Job page
>   3.1 - Submit a Job
# get /job/new
ok 1 - request parameter module is job
ok 2 - request parameter action is new
# post /job
ok 3 - request parameter module is job
ok 4 - request parameter action is create
ok 5 - page redirected to /index.php/job/e3e4769832325590aafccd6a7b81a20ba4ae43e1
ok 6 - request parameter module is job
ok 7 - request parameter action is show
1..7
# Looks like everything went fine.

見事に想定どおりの動きができました。
これがもし投稿に失敗していた場合、リダイレクトされませんのできちんとエラーが表示されます。

not ok 5 - page redirected
#     Failed test (C:\xampp\php\PEAR\symfony\test\sfTesterResponse.class.php at line 432)
 LogicException: The request was not redirected.
   at () in symfony/util/sfBrowserBase.class.php line 540
   at sfBrowserBase->followRedirect() in n/a line n/a
   at call_user_func_array() in symfony/test/sfTestFunctionalBase.class.php line 433
   at sfTestFunctionalBase->__call() in n/a line n/a
   at JobeetTestFunctional->followRedirect() in symfony/test/functional/frontend/jobActionsTest.php line 94

不正な値を投稿したり、必須項目が足りてないなどの場合にエラーが発生するのを確認してみましょう。

/test/functional/frontend/jobActionsTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$browser->
  info('  3.2 - Submit a Job with invalid values')->
 
  get('/job/new')->
  click('Preview your job', array('job' => array(
    'company'      => 'Sensio Labs',
    'position'     => 'Developer',
    'location'     => 'Atlanta, USA',
    'email'        => 'not.an.email',
  )))->
 
  with('form')->begin()->
    hasErrors(3)->
    isError('description', 'required')->
    isError('how_to_apply', 'required')->
    isError('email', 'invalid')->
  end()
;

>php test/functional/frontend/jobActionsTest.php
>   3.2 - Submit a Job with invalid values
# get /job/new
# post /job
not ok 1 - the submitted form has 3 errors.
#     Failed test (C:\xampp\php\PEAR\symfony\test\sfTesterForm.class.php at line 91)
#            got: 4
#       expected: 3
ok 2 - the submitted form has a description error (required).
ok 3 - the submitted form has a how_to_apply error (required).
ok 4 - the submitted form has a email error (invalid).
# Looks like you failed 1 tests of 4.

エラーが発生するのを確認するテストでエラーになりました。
なんか手元では'type'フィールドが必須になってるんだが何故違うんだろう。
ということで
    hasErrors(4)->isError('type', 'required')->
としてみると見事にエラーの発生に成功しました。

なんか変な文だな。エラーに成功。 
PR


2010/12/27 22:42 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<EC-CUBE 一部のページだけデザインを変更 | HOME | 今週の実績 2010/12/26>>
忍者ブログ[PR]