19929
環境：  
`CentOS6.7`, `ruby 2.2.2p95`, `rails 4.2.4`  
CentOSは`vagrant`経由で起動した、`virtualbox`上の仮想ゲストOSです。

今まで使ったことのなかった`guard`の実験をしています。

```

    --Guardfile--
    guard :minitest do
      watch '/opt/rails/rails_app/app/views/static_pages/home.html.haml'
    end
    
```

ファイルの指定は間違ってないように思います。

```

    $ ls /opt/rails/rails_app/app/views/static_pages/
    about.html.haml  help.html.haml  home.html.haml
    
```

中身はこれだけです。

```

    $ cat /opt/rails/rails_app/app/views/static_pages/home.html.haml 
    = provide :title, 'home'
    %h1 StaticPages#home
    
```

テストは次のように用意しました。

```

    $ cat test/controllers/static_pages_controller_test.rb 
    require 'test_helper'
    
    class StaticPagesControllerTest < ActionController::TestCase
      def setup
        @base_title = 'ROR tutorial'
      end
    
      test "should get home" do
        get :home
        assert_response :success
        assert_select 'title', "home | #{@base_title}"
      end
    
      test "should get help" do
        get :help
        assert_response :success
        assert_select 'title', "help | #{@base_title}"
      end
    
      test "should get about" do
        get :about
        assert_response :success
        assert_select 'title', "about | #{@base_title}"
      end
    end
    
```

`Gemfile`での`guard`に関する部分は次のとおりです。

```

    $ cat Gemfile | grep guard
    gem 'guard', group: :development
    gem 'guard-minitest', group: :development
    
```

この後`guard`を起動し、それ自体の起動は問題なさそうに見えました。

```

    $ bundle exec guard -p
    13:31:34 - INFO - Guard::Minitest 2.4.4 is running, with Minitest::Unit 5.8.2!
    13:31:34 - INFO - Running: all tests
    Run options: --seed 5814
    # Running:
    ...
    Finished in 1.391047s, 2.1566 runs/s, 4.3133 assertions/s.
    3 runs, 6 assertions, 0 failures, 0 errors, 0 skips
    13:32:00 - INFO - Guard is now watching at '/opt/rails/rails_app'
    [1] guard(main)>
    
```

が、これ以降、`app/views/static_pages/home.html.haml`を編集・保存しても全く`guard`の挙動に動いた形跡が見られません。例えばわざとエラーが起きるような修正をしても何の反応もなく、手動で`rake
test`するときちんとエラーが返ってくるという状況です。

[こちら](https://ja.stackoverflow.com/questions/7609/guard%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%81%8C%E8%87%AA%E5%8B%95%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84)を見て、`guard
-p` も試してみましたが、結果が変わりません。  
そもそも共有フォルダもnfsも関係のない場所で処理しているので、最初から無関係だったようです。

`Guardfile`の中身を少しでも書き換えると`guard`が自動再起動してテストの読み込み・実行を行うことは確認できたので、十中八九、`Guardfile`の書き間違いなのだろうとは思うのですが、正規表現ではなくファイルを直接指定する書き方をしているつもりなので、これで動かないとなるとどういうことなのか混乱しています。  
何かしらヒントをご存じの方がいらしたら、ご教示をお願いします。
CC BY-SA 3.0
2015-12-13T04:57:00.737
19927
2015-12-13T06:58:01.333
2017-04-13T12:52:39.113
-1
9403
question
ruby-on-rails
guard + minitest を自動で動かせない
Guardfileを以下のように変更してみて下さい。  
`app/views/static_pages/home.html.haml`が変更されると、`test/controllers/static_pages_controller_test.rb`が実行されるようになるはずです。

```

    guard :minitest, test_folders: 'test', all_on_start: false, spring: true do
      watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) \
        { |m| "test/controllers/#{m[1]}_controller_test.rb" }
    end
    
```

ちなみに上のコードは拙著「[RSpecユーザのためのMinitestチュートリアル](https://leanpub.com/everydayrailsrspec-
jp)」で解説したGuardfileがベースになっています。  
これ以外のパターンも載っているので、良かったら参考にしてみて下さい。

## 追記

>
> 直接ファイルを指定する方法（watch('Gemfile.lock')のような書き方があった）から試してみたのに駄目だったのは何が理由だった‌​か、ヒントでいいので教えていただくことはできますでしょうか。

<https://github.com/guard/guard/wiki/Guardfile-examples>
ではminitestの場合のサンプルが載ってないですね。  
直接ファイルだけを指定するパターンだと、`guard :bundler`や`guard :pow`にしか載ってません。  
比較的形式が近いのは`guard 'rspec'`ですが、形式が近いだけであって、全く同じではありません。

参考にするのであれば、 <https://github.com/guard/guard-minitest> を見るのが良いと思います。

guard-minitestの場合、

`watch(監視するファイルの正規表現) {|m| 変更があったときに実行するテストファイル }`

の形式でGuardfileを定義します。  
（`#{m[1]}`のような部分には正規表現でマッチした文字列が入ります）

正規表現を使わずに

`watch(特定のファイルパス) {|m| 変更があったときに実行するテストファイル }`

のように書くこともできますが、

`watch(特定のファイルパス)`

だけだと、「そのファイルが変更されても、どのテストを実行したらいいかわからないので、結局何も起きない」という結果になってしまいます。
CC BY-SA 3.0
2015-12-13T05:39:02.607
19929
2015-12-13T06:58:01.333
2015-12-13T06:58:01.333
85
85
19927
answer