Как запретить RSpe c дважды запускать спецификации в плагине Rails с фиктивным приложением? - PullRequest
2 голосов
/ 11 февраля 2020

Я пишу расширение Rails. Чтобы проверить это, я использую RSpe c. Чтобы создавать модели для тестирования плагина, я использую предварительно созданное фиктивное приложение:

rails plugin new yaffle --dummy-path=spec/dummy --skip-test --full

У меня есть несколько тестов. Когда я звоню им, они запускаются дважды.

> # I have 4 tests in app total
> rspec
> 8 examples, 0 failures
> rspec spec/yaffle/active_record/acts_as_yaffle_spec.rb
> 4 examples, 0 failures
> rspec spec/yaffle/active_record/acts_as_yaffle_spec.rb:4
> 2 examples, 0 failures

Вот так выглядят мои файлы:

# lib/yaffle.rb
Gem.find_files('yaffle/**/*.rb').each { |path| require path }

module Yaffle
  # Your code goes here...
end
# spec/spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../dummy/config/environment", __FILE__)

RSpec.configure do |config|
  config.example_status_persistence_file_path = '.rspec_status'
  config.disable_monkey_patching!
end
# spec/dummy/config/environment.rb
# Load the Rails application.
require_relative 'application'

# Initialize the Rails application.
Rails.application.initialize!
# spec/yaffle/active_record/acts_as_yaffle_spec.rb

require "spec_helper"

RSpec.describe "Acts as yaffle" do
  def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
    assert_equal "last_squawk", Hickwall.yaffle_text_field
  end

  def test_a_wickwalls_yaffle_text_field_should_be_last_tweet
    assert_equal "last_tweet", Wickwall.yaffle_text_field
  end
end
# spec/dummy/config/application.rb
require_relative 'boot'

require "rails/all"
Bundler.require(*Rails.groups)
require "yaffle"

module Dummy
  class Application < Rails::Application
    config.load_defaults 6.0
  end
end

Также я заметил, что дублируются только файлы с require "spec_helper"

Итак, что я делаю не так? И, если это ошибка, как обойти это?

1 Ответ

0 голосов
/ 13 февраля 2020

Причина

Это было вызвано этой строкой:

Gem.find_files('yaffle/**/*.rb').each { |path| require path }

Очевидно, Gem.find_files получает все файлы в каталоге gem, которые соответствуют этому шаблону - не только файлы, относящиеся к gem root. Итак, yaffle/**/*.rb означает оба файла в <GEM_ROOT>/lib/yaffle/... и <GEM_ROOT>/spec/lib/yaffle/....

https://apidock.com/ruby/v1_9_3_392/Gem/find_files/class

Fix

Я исправил это, потребовав все файлы явно:

require 'lib/yaffle/active_record/acts_as_yaffle'
require 'lib/yaffle/active_record/has_fleas'

Также можно просто запросить все файлы из этого каталога:

Dir["lib/yaffle/active_record/**/*.rb"].each {|file| require file }
...