Rails+AngularJSのアプリをJasmineでテストする
概要
- Rails + AngularJS + Jasmine + CoffeeScript
- Rails + AngularJSはこちら: Rails単体でAngularJSとTwitterBootStrapを組み合わせた環境構築 - Qiita
- Jasmineさいつよ
参考資料
- 以下の2つを組み合わせる
手順
jasmine-railsのインストール
- ここは参考資料通り
# Gemfile group :development, :test do gem 'jasmine-rails' end
で
bundle install
rails g jasmine_rails:install
したら一式インストール完了- 楽ちんすぎてばかになりそうだ
angular-mocksのインストール
- Jasmineでテストしようとすると、
angular-mocks
が必要になる。 - 入ってないとこれ以降の手順で以下のエラーが出る。
ReferenceError: module is not defined
- application.jsでrequireする
- なんらかの手段でangular-mocksのパッケージは入れておくこと
//= require angular-mocks
実際のテスト
- 先のjasmine-railsのインストールで、テスト用のページは作られているのでSpecRunner.htmlなどは不要で、そのままテストを書けばよい。
describe "HogesController", -> beforeEach -> module('myApp') beforeEach -> inject ($controller, $rootScope, Hoge) -> @scope = $rootScope.$new() @ctrl = $controller("HogeController", { $scope: @scope }) spyOn(Hoge, "query").and.callFake -> return [] it "search()", -> @scope.search() expect(@scope.hoges).toEqual([])
myApp
にHoge
サービスと、HogesController
が定義されており、HogesController
のsearch()
をテストすることとする。最初のbeforeEachでmoduleを準備する。
- 次のbeforeEachで
@scope
とテスト対象のコントローラを定義する。- ついでに
Hoge
サービスのquery()
で返ってくる値をspyOn
で代役を立てておく。これで実際に通信しにいくことはない。 spyOn
はJasmineのSpy機能の1つ
- ついでに
- itでテストを行う。
HogesController
でsearch()
が実行された後、scopeのhoges
にHoge
サービスのquery()
の戻り値が入っていることを期待する。