RSpec - Объект * должен * быть создан один раз, но вместо этого создается для каждого теста - PullRequest
2 голосов
/ 05 сентября 2011

Я пытаюсь создать тестовые сценарии rspec (rspec2) для помощника, которого я разрабатываю.Этот помощник в основном делает некоторые вещи с объектами "Сигнал".В моем приложении «Сигнал» связан с «Автором».

Проблема, с которой я здесь сталкиваюсь, заключается в том, что при тестировании с использованием кода, подобного следующему:

describe SignalHelper do
  let(:author) { Author.create(author_identifier: "foobar_identifier") }

  specify "should fail to instantiate without an author" do
    lambda { SignalHelper.new }.should raise_error
  end

  specify "should instantiate with a valid author" do
    SignalHelper.new(author)
  end
end

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

Что я могу сделать, чтобы создать ОДНОГО Автора до запуска всех тестов и использовать одного и того же автора в каждом тесте?

Я думал, что использование let() было правильным подходом, но это, очевидноне тот случай.Я также пробовал код, который выглядел как этот, но безуспешно:

describe SignalHelper do
  let(:author) { Author.create(author_identifier: "foobar_identifier") }

  before(:all) do 
    author
  end

  specify "should fail to instantiate without an author" do
    lambda { SignalHelper.new }.should raise_error
  end

  specify "should instantiate with a valid author" do
    SignalHelper.new(author)
  end
end

Спасибо!

Ответы [ 3 ]

1 голос
/ 05 сентября 2011
0 голосов
/ 16 апреля 2013

В моем случае гем database_cleaner удалял записи после каждого теста, поэтому let() воссоздали их.

config.after(:each) { DatabaseCleaner.clean }

0 голосов
/ 05 сентября 2011

Использование #let - правильный подход, так как он гарантирует, что вы не разделяете состояние ваших тестовых объектов между примерами спецификаций.Если по какой-то причине вы не можете создать несколько авторов, просто создайте их в виде ивара:

describe SignalHelper do
  before(:all) { @author = Author.create(author_identifier: "foobar_identifier") }

  specify "should fail to instantiate without an author" do
    lambda { SignalHelper.new }.should raise_error
  end

  specify "should instantiate with a valid author" do
    SignalHelper.new(@author)
  end
end
...