概要
Mochaを使ったユニットテストベースのコーディングっていいよね。何が「良い♪」って、「テストで仕様を定めて(設計して)、その後に実装する」ってのが良いよねー。期待した設計に成っているか、を勝手に検証してくれらから♪(※ここまで、ひとつ前の投稿と同じ)
・・・を伝えられそうな断片のメモです。その2。
コメントで、仕様をメモしなくていい。
以下のような、IO仕様のメモ(1枚目)は、テストで表現すれば良い(2枚目)。
Mochaを使ったユニットテストベースのコーディングっていいよね。何が「良い♪」って、「テストで仕様を定めて(設計して)、その後に実装する」ってのが良いよねー。期待した設計に成っているか、を勝手に検証してくれらから♪(※ここまで、ひとつ前の投稿と同じ)
・・・を伝えられそうな断片のメモです。その2。
以下のような、IO仕様のメモ(1枚目)は、テストで表現すれば良い(2枚目)。
Mochaを使ったユニットテストベースのコーディングっていいよね。何が「良い♪」って、「テストで仕様を定めて(設計して)、その後に実装する」ってのが良いよねー。期待した設計に成っているか、を勝手に検証してくれらから♪
・・・を伝えたいんだけど、どう伝えたらよいか分からない。たとえば、こんな流れが「良い♪」って思うんだよ、のメモです。
return shouldFulfilled(
api_vi_activitylog_remove( queryFromGet, dataFromPost )
).then(function( result ){
assert( stubs.sql_parts.createPromiseForSqlConnection.calledOnce, "createPromiseForSqlConnection()が1度呼ばれる" );
assert( stubs.sql_parts.closeConnection.calledOnce );
assert( stubs.sql_parts.isOwnerValid.calledOnce );
// ここまでは、API_V1_BASE()で検証済みなので、簡易検証。
// isOwnerValid()へ渡されるパラメータを直に検証する。
// 何故なら「get〜()で生成したオブジェクトを直に渡す」ではなく、このテスト対象の中で生成するから。
expect( stubs.sql_parts.isOwnerValid.getCall(0).args[0] ).to.equal( TEST_CONFIG_SQL.database );
expect( stubs.sql_parts.isOwnerValid.getCall(0).args[1] ).to.equal( dataFromPost.device_key );
expect( stubs.sql_parts.isOwnerValid.getCall(0).args[2] ).to.equal( dataFromPost.pass_key );
var deletedResponse = stubs.sql_parts.deleteActivityLogWhereDeviceKey;
assert( deletedResponse.calledOnce, "SQLへのログ削除クエリー。deleteActivityLogWhereDeviceKey()が1度呼ばれること。" );
expect( deletedResponse.getCall(0).args[0] ).to.equal( TEST_CONFIG_SQL.database );
expect( deletedResponse.getCall(0).args[1] ).to.equal( dataFromPost.device_key );
expect( deletedResponse.getCall(0).args[2] ).to.be.null; // { start, end } を指定しない。⇒全期間が対象になる。
assert( stubs.sql_parts.getNumberOfLogs.calledOnce, "getNumberOfLogs()が1度だけ呼ばれること。" );
expect( stubs.sql_parts.getNumberOfLogs.getCall(0).args[0] ).to.equal( TEST_CONFIG_SQL.database );
expect( stubs.sql_parts.getNumberOfLogs.getCall(0).args[1] ).to.equal( dataFromPost.device_key );
assert( stubs.sql_parts.deleteExistUser.calledOnce, "deleteExistUser()が1度だけ呼ばれること。" );
expect( stubs.sql_parts.deleteExistUser.getCall(0).args[0] ).to.equal( TEST_CONFIG_SQL.database );
expect( stubs.sql_parts.deleteExistUser.getCall(0).args[1] ).to.equal( dataFromPost.device_key );
expect( result ).to.be.exist;
expect( result ).to.have.property("status").to.equal(200);
expect( result ).to.have.property("jsonData");
expect( result.jsonData ).to.have.property( "removed" );
expect( result.jsonData.removed ).to.deep.equal({
"device_key" : dataFromPost.device_key
});
});
先ずは、枠だけ作ったヤツを実行。当然失敗する。
設計であるテストコードを見てみる。
失敗したテストに応じて実装していく。
実装ミス(今回のはtypo)は、テストの失敗として検出できる。
無事に全部テストがpassした=実装が完了!
・・・っての、伝えたいし、以前に知りたかったのだが、、、どう伝えたら良いか分からない、見たことが無い。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
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 |