Рельсы изолированные тесты, работающие под рельсами env - PullRequest
0 голосов
/ 22 марта 2012

В настоящее время я работаю над проектом, и мы начали переносить наши тесты в изолированный тест (без зависимости от rails, а также с использованием заглушек и макетов). Дело в том, что пока все текущие тесты не будут изолированы, мы должны запустить тесты вместе с изолированными тестами, которые запустят среду rails.

Проблема возникает, когда в изолированных тестах существует поддельный класс (класс Foo; end;), он переопределяет исходный класс для остальных тестов.

Пример: В файле foo_spec.rb есть эта строка

class Bar; end;

Это переопределит класс Bar для следующих неизолированных тестов и вызовет множество сбоев.

Есть два подхода, которые я мог бы найти, чтобы избавиться от этого: - либо закомментируйте поддельные классы, когда тесты запускаются с помощью rails env - поместите изолированные тесты в другую папку и запускайте их отдельно от остальных (в этом есть смысл)

Можете ли вы придумать лучший способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Я не знаю, правильно ли это , верно , но в итоге я фактически не назначаю такие контекстные фиктивные фиктивные классы, созданные вручную, константам.

Вместо:

#no
class Foo
   #something
end

Вместо того, чтобы:

foo = Class.new do
  #stuff
end

И вы можете foo.new или foo.class_method, если хотите. Может быть в @foo тоже. Но вы не присваиваете ее константе Foo, как это делает обычное определение класса, вы создаете «анонимный» класс и присваиваете его обычной переменной, ограниченной областью, в которой вы нуждаетесь.

Примечание: я не говорю, что это "правильный" способ сделать что-то с помощью rspec, я никогда не чувствую, что знаю, что делать правильно, правильной вещью может быть как-то вообще не создавать классы, подобные этому Или используйте какую-нибудь странную фабричную вещь, которую я не понимаю, или что-то в этом роде. Но когда мне нужно создать классы типа «пустышка» только для целей конкретного теста или блока, это то, что я делаю.

0 голосов
/ 22 марта 2012

мы используем rspec (который не должен ничего менять), и наша спецификация rails находится в spec с их собственным spec_helper.rb файлом, который загружает env и все ужасные вещи.

в *В папке 1005 * есть все спецификации, которые могут работать без рельсов, со своим собственным помощником спецификаций, который загружает только нашу независимую папку lib.

для нашего ci-сервера, мы позволяем обеим папкам спецификаций работать в разныхзадача:

if Rails.env.test?
  require 'rspec/core/rake_task'
  require 'ci/reporter/rake/rspec'

  RSpec::Core::RakeTask.new(:all_fast) do |t|
    t.pattern = 'spec_fast/**/*_spec.rb'
  end

  RSpec::Core::RakeTask.new(:all_slow) do |t|
    t.pattern = 'spec/**/*_spec.rb'
  end

  task :all => ["ci:setup:rspec", :all_fast, :all_slow]
end

также может быть возможно просто поместить их в отдельные подпапки, такие как spec/rails и spec/fast, но я не пробовал, потому что это означает, что нужно много менять путь вSpec-файлов.

...