2013-11-25 46 views
16

我很確定守衛是罪魁禍首,因爲運行rspec運行所有規格一次。運行guardenter會導致所有規格運行兩次。不知道爲什麼。谷歌搜索到了破壞,並且常見的陷阱,比如在spec_helper.rb中需要'rspec/autorun',根本就不是它的原因。守衛運行我的規格兩次

當規格開始變慢時,它會變得非常煩人!

.rspec

--color 
--order default 

Guardfile

# A sample Guardfile 
# More info at https://github.com/guard/guard#readme 

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 example 
    watch(%r{^app/(.+)\.rb$})       { |m| "spec/#{m[1]}_spec.rb" } 
    watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$})   { |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" } 

    # Capybara features specs 
    watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$})  { |m| "spec/features/#{m[1]}_spec.rb" } 

    # 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 

spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'capybara/rspec' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

# Checks for pending migrations before tests are run. 
# If you are not using ActiveRecord, you can remove this line. 
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 

RSpec.configure do |config| 
    # ## Mock Framework 
    # 
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: 
    # 
    # config.mock_with :mocha 
    # config.mock_with :flexmock 
    # config.mock_with :rr 
    config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    Capybara.run_server = false 
    Capybara.javascript_driver = :webkit 
    Capybara.default_selector = :css 
    Capybara.server_port = 7171 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    # config.include RSpec::Rails::RequestExampleGroup, type: :feature 

    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 
    config.use_transactional_fixtures = true 

    # If true, the base class of anonymous controllers will be inferred 
    # automatically. This will be the default behavior in future versions of 
    # rspec-rails. 
    config.infer_base_class_for_anonymous_controllers = false 

    # Run specs in random order to surface order dependencies. If you find an 
    # order dependency and want to debug it, you can fix the order by providing 
    # the seed, which is printed after each run. 
    #  --seed 1234 
    config.order = "random" 
end 

更新

這可能給一個線索

$ guard 
06:40:31 - INFO - Guard is using GNTP to send notifications. 
06:40:31 - INFO - Guard is using TerminalTitle to send notifications. 
06:40:31 - INFO - Guard::RSpec is running 
06:40:31 - INFO - Guard::RSpec is running 
06:40:31 - INFO - Guard is now watching at '/Users/starkers/Desktop/boxshare' 
[1] guard(main)> 
06:40:35 - INFO - Run all 
06:40:35 - INFO - Running all specs 

通知在六時四十分31秒兩個信息日誌,這些日誌Rspec的運行...

+0

? –

+0

我在一個單獨的終端窗口中運行Guard/Spork服務器。我注意到我的'guard'終端窗口先運行新的測試,然後我的'main'窗口顯示相同的輸出。但是如果我重新運行相同的測試,那麼'警衛'窗口不會重新顯示。你使用單獨的窗口作爲警衛服務器嗎? – Chiperific

+0

@Chiperific我確實。 – Starkers

回答

3

我已經看到了這個問題的好幾倍。該問題通常(但不總是)由RSpec設置重複引起。嘗試從spec_helper.rb中刪除config.order = "random"行,因爲您的.rspec文件中已經有了該設置。

+0

可能是這樣,但可悲的是,我個人不工作。我更新了可能是線索的問題:) – Starkers

4

FWIW,我也有這個問題。 Guard正在運行我所有的rspec測試兩次。事實證明,我運行了兩次,並且我的Guardfileguard ... do ... end stanza重複.... doh。

+0

謝謝!我有同樣的問題。我剛剛刪除Guardfile並運行guard init rspec來擺脫所有重複。 –