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

第18章 xUnit へ向かう小さな一歩 #23

Merged
merged 7 commits into from
Jan 9, 2018
Merged

第18章 xUnit へ向かう小さな一歩 #23

merged 7 commits into from
Jan 9, 2018

Conversation

at-grandpa
Copy link
Owner

第Ⅱ部からは、メモ程度を書いていく。

@at-grandpa
Copy link
Owner Author

at-grandpa commented Jan 9, 2018

TODO

  • テストメソッドを呼び出す
  • setUpを最初に呼び出す
  • tearDownを後で呼び出す
  • テストメソッドが失敗したとしてもtearDownを呼び出す
  • 複数のテストを走らせる
  • 収集したテスト結果を出力する

まずは手作業でのテストを行っていく。

@at-grandpa
Copy link
Owner Author

「メソッドを呼んだら、フラグがtrueになる」を実装した。

$ crystal src/xunit.cr
false
true

@at-grandpa
Copy link
Owner Author

runメソッドを追加して、インターフェースを整えた。

$ crystal src/xunit.cr
false
true

@at-grandpa
Copy link
Owner Author

リファクタリングは部分的な箇所に限定してい行っていく。一回の変更は小さくすること。そして、そのテストを書くこと。

@at-grandpa
Copy link
Owner Author

アドバイス頂いた。
https://twitter.com/arcage/status/950653404707090432

Crystal::Macros::TypeNode#methodsCrystal::Macros::ArrayLiteral(Def) を返す。
https://crystal-lang.org/api/0.24.1/Crystal/Macros/TypeNode.html#methods%3ACrystal%3A%3AMacros%3A%3AArrayLiteral%28Def%29-instance-method

Def はmethodのdefを扱うASTで、
https://crystal-lang.org/api/0.24.1/Crystal/Macros/Def.html
ここに載っていて、nameメソッドでメソッド名を取得できる。

@at-grandpa
Copy link
Owner Author

今までの流れは、

  • べた書きの値で動くようにする
  • 他の値をべた書きにしてみる
  • さまざまな場合の値でも動くように変数化する

という「三角測量」で進めてきた。今回もこれに準ずる。

@at-grandpa
Copy link
Owner Author

基本的に、親クラスにしかないデータを扱うメソッドは親クラスに持っていこう。データとそれを扱う処理は近いほうが良い。

@at-grandpa
Copy link
Owner Author

assert文の代替を行った。
正常であればなにも起きない。

$ crystal src/xunit.cr
$

異常であればException.

$ crystal src/xunit.cr
Expected: false
     got: true (Spec::AssertionFailed)
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/spec/methods.cr:87:5 in 'fail'
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/spec/expectations.cr:335:9 in 'should'
  from src/xunit.cr:11:5 in 'test_running'
  from src/xunit/test_case.cr:6:5 in 'run'
  from src/xunit.cr:15:1 in '__crystal_main'
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/crystal/main.cr:11:3 in '_crystal_main'
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/crystal/main.cr:112:5 in 'main_user_code'
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/crystal/main.cr:101:7 in 'main'
  from /usr/local/Cellar/crystal-lang/0.24.1_1/src/crystal/main.cr:135:3 in 'main'

@at-grandpa
Copy link
Owner Author

at-grandpa commented Jan 9, 2018

TODO

  • テストメソッドを呼び出す
  • setUpを最初に呼び出す
  • tearDownを後で呼び出す
  • テストメソッドが失敗したとしてもtearDownを呼び出す
  • 複数のテストを走らせる
  • 収集したテスト結果を出力する

@at-grandpa
Copy link
Owner Author

振り返り。

  • 大風呂敷を広げたら失敗したので、小さく進むようにした
  • メソッド名をべた書きで行っていたが、変数に置き換えた
  • Pluggable Selector パターンを使った
    • 文字列のメソッド名から、動的にメソッドを呼び出す
    • 静的解析が難しいのでおすすめしない
    • crystalの場合はmacroで解決した
  • とても小さなステップで歩みだした

@at-grandpa
Copy link
Owner Author

得た知見。

  • できるだけ小さくいこう
  • 三角測量を使おう

@at-grandpa at-grandpa merged commit 07d64eb into master Jan 9, 2018
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.

1 participant