MeteorJSとReactを勉強してみる その11: テストコードを書いてみよう【公式翻訳】
本稿で公式のチュートリアルは実質最後になります。
ここまで見てくださった方、ありがとうございましたm(. .)m
その他必要な項目については引き続き翻訳していきますので、今しばらくお付き合いください。
テストコードを書いてみよう
ここまででいくつかの機能を作り上げましたので、コードの悪化を防ぎ、予期しない動作を防ぐためにもテストコードを追加しましょう。
これから、APIのうち「書き込み」の部分のメソッドを動かすテストを書き、正しく動作することを確かめましょう。
そのために、MochaというJavascriptのテストフレームワークのドライバを追加し、同時にテストの前提を構築するアサーションのライブラリも追加しましょう。
meteor add meteortesting:mocha meteor npm install --save-dev chai
コマンドを利用してテストドライバを指定することで、「テストモード」でアプリを動かすことが出来るようになりました。
そのためには、通常のアプリを停止させるか、--port XYZ
で別のポートを開く必要があります。
TEST_WATCH=1 meteor test --driver-package meteortesting:mocha
上記コマンドを叩くと、ターミナルウィンドウに「0 passing」のメッセージが表示されるはずです。
まずは単純なテストを追加してみましょう。 この時点ではこのテストコードは何も行いません。
imports/api/tasks.tests.js
/* eslint-env mocha */ import { Meteor } from 'meteor/meteor'; if (Meteor.isServer) { describe('Tasks', () => { describe('methods', () => { it('can delete owned task', () => { }); }); }); }
どんなテストにおいても、実行する前にデータベースが想定通りの状態になっていることが保証されている必要があります。 そのためには、Mochaの「beforeEach」構文を使うのが簡単です。
imports/api/tasks.tests.js
before
/* eslint-env mocha */ import { Meteor } from 'meteor/meteor'; if (Meteor.isServer) { describe('Tasks', () => { describe('methods', () => { it('can delete owned task', () => { }); }); }); }
after
/* eslint-env mocha */ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Tasks } from './tasks.js'; if (Meteor.isServer) { describe('Tasks', () => { describe('methods', () => { const userId = Random.id(); let taskId; beforeEach(() => { Tasks.remove({}); taskId = Tasks.insert({ text: 'test task', createdAt: new Date(), owner: userId, username: 'tmeasday', }); }); it('can delete owned task', () => { }); }); }); }
これで、毎回のテスト実行時に異なるuserIdを生成して実行されるタスクが作れました。
さて、自動生成されるユーザーとしてtask.remove
を実行し、タスクが削除されることを保証するテストを書いていきましょう。
imports/api/tasks.tests.js before
/* eslint-env mocha */ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Tasks } from './tasks.js'; if (Meteor.isServer) { describe('Tasks', () => { describe('methods', () => { const userId = Random.id(); let taskId; beforeEach(() => { Tasks.remove({}); taskId = Tasks.insert({ text: 'test task', createdAt: new Date(), owner: userId, username: 'tmeasday', }); }); it('can delete owned task', () => { }); }); }); }
after
/* eslint-env mocha */ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; import { Tasks } from './tasks.js'; if (Meteor.isServer) { describe('Tasks', () => { describe('methods', () => { const userId = Random.id(); let taskId; beforeEach(() => { Tasks.remove({}); taskId = Tasks.insert({ text: 'test task', createdAt: new Date(), owner: userId, username: 'tmeasday', }); }); it('can delete owned task', () => { // Find the internal implementation of the task method so we can // test it in isolation const deleteTask = Meteor.server.method_handlers['tasks.remove']; // Set up a fake method invocation that looks like what the method expects const invocation = { userId }; // Run the method with `this` set to the fake invocation deleteTask.apply(invocation, [taskId]); // Verify that the method does what we expected assert.equal(Tasks.find().count(), 0); }); }); }); }
There's a lot more you can do in a Meteor test! You can read more about it in the Meteor Guide article on testing.
Meteorのテストではもっとたくさん出来ることがあります! テストについて詳しくは、Meteor Guideのテストに関する記事でチェックしてみてくださいね。
前回の更新からかなり時間が経ってしまいました。
もし読んでくれている方がいましたら申し訳ありませんmm
チュートリアル自体はこれで終了ですが、meteorについては引き続き個人的に触っていくつもりなので、折に触れて記事を投稿していきたいと思います。
気が向いたらちらっとでも見てやって下さい。
お疲れ様でした!