![](/img/trans.png)
[英]How do I test that I have set up a many to many relationship correctly in rails?
[英]How do I set up a Rails Angular project to test JS?
我正在嘗試設置我的Rails Angular項目來提供JS測試。 我幾乎嘗試過在Google上找到的所有內容:
但我失敗了所有人。 我正在尋找一種以最無痛的方式運行單元和e2e測試的方法(它可以在Guard或Karma中,我不在乎,但它必須在后台自動運行它)。
有沒有人有一些很好的文章,有一個很好的例子,如何實現這一目標? 在我的研究中,我發現了這一點 ,但恕我直言,這是一個如何不這樣做的例子。
我的實際Gemfile
:
source 'https://rubygems.org'
# Use Ruby 1.9.3 instead default Heroku's 1.9.2
# for development I suggest https://gist.github.com/1688857
ruby '1.9.3'
gem 'rails', '3.2.12'
# Use PostgreSQL, which is quite awesome, fast and easy
gem 'pg'
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'bootstrap-sass', '~> 2.3.1'
# I heard that you like Compass
gem 'compass'
# Angular.js
gem 'angularjs-rails'
gem 'angularjs-rails-resource'
gem 'angular-ui-rails'
# Assets should be minified before production
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
# Serve static pages like a boss
gem 'high_voltage'
# Some user management will be nice
gem 'devise' # User management
# gem 'cancan' # And they privileges
# To use Jbuilder templates for JSON
gem 'jbuilder'
# Be fast and deadly as Puma
#gem 'puma'
# We need also some administration panel, don't we?
gem 'rails_admin'
# Some helpers
gem 'andand'
group :development do
# IRb is ugly. Use Pry for the God's sake
gem 'pry-rails'
# Deploy with Capistrano
# gem 'capistrano'
# or Vlad the Deployer
# gem 'vlad'
# Why bother yourself with rerunning tests? Use Guard
gem 'guard'
gem 'guard-rspec'
gem 'guard-spork'
gem 'guard-livereload'
gem 'guard-jasmine'
gem 'rb-fsevent', require: false
gem 'rb-inotify', require: false
# Who like ugly error pages? We don't.
gem 'better_errors'
gem 'binding_of_caller'
# Prettier documentation
gem 'yard'
end
group :development, :test do
# Use RSpec for testing
gem 'rspec-rails', '~> 2.12.0'
# Test JS using Jasmine
gem 'jasmine'
gem 'jasmine-headless-webkit'
# Some DB table generator
gem 'factory_girl_rails', '~> 4.1.0'
# And fake data generator
gem 'ffaker'
end
group :test do
# Some Gherkins will be also good (to vodka of course)
gem 'turnip', '~> 1.1.0'
# Aww, an of course some web browser will be also apprised
gem 'capybara', '~> 2.0.1'
# Clean DB after tests
gem 'database_cleaner'
# Some nice matchers
gem 'shoulda-matchers'
# Extend your mocks
gem 'bourne', '~> 1.2.1'
# Coverage reports will be nice
gem 'simplecov', require: false
end
PS:如果我能以簡單的方式創建報道報告,那就太好了。
我感覺到你的痛苦,我花了一些試驗和錯誤來為我的Rails應用程序運行所有測試。 我最終使用Guard為開發人員持續測試規范,接受和javascripts。 這是我勞動的成果。
這是您需要包含的Gemfile代碼段。 它有Guard , Jasmine , Rspec和Turnip所需的寶石。 這個設置適用於MRI和JRuby,我們對兩者進行測試。
group :test, :development do
# Guard
gem 'guard-jasmine'
gem "guard-bundler", ">= 1.0.0"
gem "guard-rails", ">= 0.4.0"
gem "guard-rspec", ">= 2.5.2"
gem "rb-inotify", ">= 0.9.0", :require => false
gem "rb-fsevent", ">= 0.9.3", :require => false
gem "rb-fchange", ">= 0.0.6", :require => false
# Rspec
gem "rspec-rails", '~> 2.12.2'
# Jasmine
gem "jasmine", '~> 1.3.1'
gem "jasminerice"
end
group :test do
# Turnip
gem "turnip", '~> 1.1.0'
gem "capybara", '~> 2.0.3'
end
這是監視Rspec , Turnip和Jasmine以觸發測試的完整Guardfile :
guard 'rspec' do
watch(%r{^spec/.+_spec\.rb$})
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" }
# Rails
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
# Turnip features and steps
watch(%r{^spec/acceptance/(.+)\.feature$})
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end
guard :jasmine do
watch(%r{spec/javascripts/spec\.(js\.coffee|js|coffee)$}) { 'spec/javascripts' }
watch(%r{spec/javascripts/.+_spec\.(js\.coffee|js|coffee)$})
watch(%r{spec/javascripts/fixtures/.+$})
watch(%r{app/assets/javascripts/(.+?)\.(js\.coffee|js|coffee)(?:\.\w+)*$}) { |m| "spec/javascripts/#{ m[1] }_spec.#{ m[2] }" }
end
現在事情變得有點棘手。 為了讓Jasmine正確加載AngularJS進行測試,我將angular-mocks.js 1.0.7下載到目錄spec / javascripts / support / angular-mocks.js 。 spec helper和jasmine config使用它來運行AnguljarJS規范。
對於spec / javascripts / spec_helper.js.coffee ,請將其指向Rails應用程序javascript,angular-mocks.js以及所有javascript規范:
#=require ../../app/assets/javascripts/application
#=require ./support/angular-mocks
#=require_tree ./
對於Jasmine配置, spec / javascripts / support / jasmine.yml ,配置需要指向Rails應用程序javascript和angular-mocks.js。 這是我們使用的,但為了簡潔起見刪除了注釋:
src_files:
- assets/application.js
- spec/javascripts/support/angular-mocks.js
stylesheets:
- stylesheets/**/*.css
helpers:
- helpers/**/*.js
spec_files:
- '**/*[sS]pec.js'
src_dir:
spec_dir: spec/javascripts
設置好所有內容后,您只需運行bundle exec guard
,所有測試都將運行並由開發更改觸發。
你可以使用茶匙運行你最喜歡的測試套件(默認是茉莉花),他們有一個wiki與angular集成。 Teaspoon與資產管道集成,因此您可以將所有角寶石扔在那里,並在茶匙生成的spec_helper.js中要求它們。
另一個很酷的事情是:他們也有一個警衛插件。
我寫了一篇關於使用默認的Jasmine gem在Rails應用程序上設置AngularJS單元測試的簡單方法的博客文章。 為了讓事情順利進行,需要進行一些小的代碼更改,這已被Jasmine團隊接受。
http://pivotallabs.com/unit-testing-angularjs-using-jasmine/
簡而言之:
將jasmine和angularjs-rails添加到Gemfile中
gem "angularjs-rails"
gem "jasmine", github: "pivotal/jasmine-gem"
安裝寶石並運行Jasmine生成器
$ bundle install
$ rails g jasmine:install
在應用程序代碼的其余部分之前,將angular添加到application.js
//= require angular
//= require_tree .
創建一個名為./spec/javascripts/helpers/angular_helpers.js
的文件並添加此行
//= require angular-mocks
現在,您可以在app/assets
目錄中包含AngularJS實現文件,並編寫使用提供的模擬的測試。 當你升級angularjs-rails
gem時,你會同時獲得angular.js
和angular-mocks.js
新版本。
您可能有一些運氣檢查它使用grunt作為構建系統的角度樣板項目 ,無論如何我認為它不是ruby,但我認為當嘗試用angular進行測試時你唯一的希望就是去nodejs / karma路線。
此設置會監視代碼中的更改並運行測試。 然而,在我有限的經驗中,我無法讓它顯示測試運行的結果。 我不確定我是做錯了什么還是不支持。
無論如何希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.