Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(nodecli): リファクタリングとユニットテストのセクション #226

Merged
merged 4 commits into from
May 25, 2017

Conversation

lacolaco
Copy link
Collaborator

#7

@lacolaco lacolaco requested a review from azu May 6, 2017 00:14
@lacolaco
Copy link
Collaborator Author

@azu 時間あるときに見てもらっても良いですか?

};
```

このようにエクスポートされたモジュールは、`require`関数によってインポートされます。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

インポートできます?

## ユニットテスト実行環境を作る

ユニットテストの実行にはさまざまな方法がありますが、
このセクションではテスティングフレームワークとして[Mocha][]を使って、ユニットテストの実行環境を作成します。
Mochaの詳細については、[JavaScript Promiseの本][]よりテストの章を参照してください。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Promise本ってここに書いてある情報と大差ない気がする( 非同期ぐらい?) ので、ここにそのまま書いていいんじゃないかなーといいう気がした。

  • Mochaはグローバルにit関数などテスト用の関数を定義している
  • テストは mocha コマンドを使って実行する
  • テストのアサーション自体はMochaとは別でここではNode.jsのコアライブラリであるassertモジュールを使う(ここの説明がちょっと面倒そうだけどちょこちょこ見る説明かも
    • assert単独の動作を見てからMocha? (一緒でも良い気はするけど)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

他の事例を見てきたけど次みたいな流れだった

  • assert単体でのテストの話

  • テストフレームワークを使うと次のような利点があるよ

    テストのグループ化
    テスト結果出力のカスタマイズ
    テスト毎のライフサイクル
    非同期処理に対するテストのサポート

  • mocha有名なのでmochaを使うよ

  • mochaはassertを自由に選べるので今回は引き続きassertを使うよ

という感じだった。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Backbone.js TestingだとなぜMocha?みたいな話は欄外だった。

168 2017-05-17 15-34-23

@@ -4,11 +4,127 @@ author: laco

# ユニットテストを記述する

このセクションでは、これまで作成したCLIアプリケーションにユニットテストを導入します。
ユニットテストを導入するためには、ソースコードを整理してテスト可能な状態にリファクタリングする必要があります。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リファクタリングといいつつ構造が変わる気がするので、
テストがしやすくなるようにモジュール化します。 的な感じでいいんじゃないかな。


```json
{
"scripts": {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ前後に devDepsとかは実際にはあるので、 ... みたいな省略表示して方がいいのかな?
(シンタックスがあれだけど…)

今回のアプリケーションでは、CLIアプリケーションとしてコマンドライン引数を処理する部分と、MarkdownをHTMLへ変換する部分に分割します。

Node.jsでは、複数のJavaScriptファイル間で変数や関数などをやりとりするために、モジュールという仕組みを利用します。
モジュールはあるJavaScritpファイル中でエクスポートされ、別のファイルからインポートされます。
Copy link
Collaborator

@azu azu May 17, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

何か微妙な違和感がある。
モジュールはファイルそのものを表すような気がする?

  • Aがモジュール
  • Aは機能(関数や値)をexportする
  • BからAモジュールをimportする
  • importしたAモジュールの機能を利用する

この文だとAが複数のモジュールをexportしてるような感じがする?

イマイチどっちが正しいか分かってないけど、ECMAScript的には
Script (<script>)と Module(<script type="module">)で、moduleはbindingをexportするみたいな感じになる気がする。
なので、ファイルからexportするのは変数や関数で、モジュールはそういうことをするファイルそのものという形になるんじゃなかな。

@lacolaco lacolaco requested a review from azu May 24, 2017 14:12
@lacolaco
Copy link
Collaborator Author

@azu モジュールとファイルの関係のあたりレビューしてもらってよいですか

greet("World"); // => Hello World!
```

`module.exports`オブジェクトに直接代入するのではなく、そのプロパティとしてオブジェクトをエクスポートすることもできます。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

そのプロパティとしてオブジェクトをエクスポートすることもできます。

エクスポートできるのはオブジェクト以外にもプリミティブな値もできるので、

そのプロパティとして任意の値をエクスポートすることもできます。

とかそんな感じ?

## ユニットテストを記述する

テストの実行環境ができたので、実際にユニットテストを記述します。
Mochaのユニットテストは`test`ディレクトリの中にJavaScriptファイルを配置して記述します。
`test/md2html.js`ファイルを作成し、`md2html.js`に対するユニットテストを次のように記述します。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

テストのファイル名 同じ名前にするか md2html-test.js みたいにするか悩みどころな感じがする(普段は後者を選ぶけど)

今回は変換元のMarkdownファイルと、期待する変換結果のHTMLファイルの2つが存在します。

`assert`関数は、Node.jsの標準モジュールのひとつである[assertモジュール][]から提供される関数です。
この関数は引数の評価結果がfalseであるとき、実行時にエラーを発生します。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

実行時にエラーを発生します

実行時にエラーが発生します or 実行時にエラーを投げます


`assert`関数は、Node.jsの標準モジュールのひとつである[assertモジュール][]から提供される関数です。
この関数は引数の評価結果がfalseであるとき、実行時にエラーを発生します。
Mochaの`it`関数はその内部でエラーが発生したとき、そのテストを失敗として扱います。
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これを先に書いて、次みたいにするのもありかなー
assertとテストの正否の関係が少しだけ唐突な感じがした。

Mochaのit関数はその関数内でエラーが発生したとき、そのテストを失敗として扱います。
つまり、期待する変換結果と異なるならエラーを投げ、期待通りならエラーを投げないというテストコードを書けば良いことがわかります。(ここ冗長なので手直し必要)
今回はNode.jsの標準モジュールのひとつであるassertモジュールを利用します。
この関数は引数の評価結果がfalseであるとき、実行時にエラーを投げます。

ちょっと冗長っぽい感じもする


[moduleオブジェクト]: https://nodejs.org/api/modules.html#modules_the_module_object
[Mocha]: http://mochajs.org/
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://mochajs.org/

リポジトリのリンクはsになってたので一応

@lacolaco
Copy link
Collaborator Author

だいたいいいかなって感じになった

@lacolaco lacolaco merged commit fc8ae9b into master May 25, 2017
@lacolaco lacolaco deleted the nodecli-unittest branch May 25, 2017 02:20
@azu
Copy link
Collaborator

azu commented May 25, 2017

一部テストできてなかったので修正した 61f21ec

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants