テスト駆動web開発勉強会 Vol.1で発表しました
Saturday, March 22, 2014 03:24:00 PM
2014/3/18にコワーキングスペース茅場町Co-Edoで開催された「テスト駆動web開発勉強会 Vol.1」で「Webアプリケーションテスト手法2014」の発表をしました。
第一回目ということと、1時間枠と限られた時間の中でCakePHPとJavaScriptについてのテストの話をしたので、ざっくりした内容となっています。
今後ハンズオンなども計画しているようなので、DoorKeeperのページをチェックしておくと良いかなーと思います。 また当日は「Java,PHPエンジニアの派遣、求人を探すならJapheego(ジャフィーゴ)」さんに懇親会スポンサーになっていただき、美味いビールとSUBWAYのサンドイッチをいただきました。感謝! 勉強会の懇親会はピザが多いのですが、連続すると飽きるのでたまにはSUBWAYのデリバリーとか良いと思いますよ!(SUBWAY大好きです)
To see files inline you need to enable JavaScript.
Yahoo has some instructions for enabling JavaScript if you’re unsure how to do it.
最後に、当日紹介したサンプルのCakePHPテストコードを掲載しておきます。
モデルのテスト例:
<?php
class PostTest extends CakeTestCase {
public $fixture = ['app.Post', 'app.Comment'];
public function setUp() {
$this->model = ClassRegistry::init('Post');
$this->model = $this->getMockForModel('Post');
$this->model = $this->getMockForModel('Post', ['save']);
}
public function testタイトルがない場合はバリデーションエラーになること() {
}
public function testデータベースへの保存に失敗した場合はfalseが戻ること() {
}
public function testデータベースへの保存に成功した場合はtrueが戻ること() {
}
public function testデータベースに新規登録できること() {
}
}
モデルの初期化方法には3つのやり方があり、通常はClassRegistry::init()
で良いのですが、モデルをモックしたい場合はgetMockForModel()
というCakeTestCaseが用意してくれているモデル専用のモックジェネレータを使います。第二引数にメソッドの配列を指定するとパーシャルモックとなり、特定のメソッドのみモックします。
コントローラのテスト例:
<?php
class PostsControllerTest extends ControllerTestCase {
public function setUp() {
$this->controller = $this->generate('Posts',[
'components' => [
'Session',
'RequestHandler'=>['isPost'],
],
'models' => [
'Post' => ['findById','delete'],
],
'methods' => [
'redirect', 'render',
],
]);
}
/**
* @expectedException NotFoundException
*/
public function test存在しない記事を表示するとNotFound例外になること() {
$this->testAction('/posts/view/999');
}
/**
* @expectedException BadRequestException
*/
public function test保存がPOST以外で呼び出されたらBadResuest例外になること() {
$this->testAction('/posts/save/1', ['method' => 'get']);
}
public function test削除が成功したらindexにリダイレクトする() {
$this->controller->Post->expects($this->once())->method('delete')
->with($this->equalTo(1))->will($this->returnValue(true));
$this->controller->expects($this->once())->method('redirect')
->with($this->equalTo('index'));
$this->testAction('/posts/delete/1', ['method' => 'delete']);
}
public function test新しいトピックを追加できたら画面にメッセージが戻ること() {
}
}
コントローラのテストをするとき、testActionメソッドを呼び出すわけですが、そのときコントローラ自体をモックするにはControllerTestCase
が用意してくれているコントローラ専用のモックジェネレータであるgenerate()
を利用します。generateで作成したインスタンスをテストケースクラスのcontroller
メンバ変数にセットすることでControllerTestCaseがURLからディスパッチするときに、このモックオブジェクトを利用してくれます。
コントローラから依存関係にある、コンポーネント、モデルについてそれぞれサンプルのようにモックでき、コントローラ自体のメソッドもmethods
に列挙することでモックできます。例えばredirect()
やrender()
などがよく使われると思います。
Recent Articles
- aws-sdk-client-mock はどのように aws-sdk をモックしているのか? 2023/02/02
- AWS Lambda の Node.js 14 を 18 に移行する(aws-sdk v3 移行編) 2023/01/04
- AWS Lambda の Node.js 14 を 18 に移行する(CI/CD環境移行編) 2022/12/30
- Node.js で Lambda ハンドラのテストを書くときに AWS イベントを生成する 2022/12/18
- Node.js で AWS SQS を使ったコードの自動テストを記述する 2022/12/18
- Node.js で BigQuery を使ったコードの自動テストを記述する 2022/12/18
- @swc-node/jest を使ってテストを高速化する(v1.5対応版) 2022/07/12
- Rails 7の採用提案で注目を集め始めた Import maps の過去、現在、そして未来について... 2022/05/06
- Middleman を 3系から 4系にアップグレードした 2022/05/06
- uvu での Test Double 2022/05/05