Rspec пусть оценивает - PullRequest
       4

Rspec пусть оценивает

33 голосов
/ 05 апреля 2011

Мне кажется, у меня проблема с rspec let и scoping.Я могу использовать методы, определенные с помощью let в примерах (блоки "it"), но не снаружи (блок описания, где я выполнял let).

5   describe Connection do
8     let(:connection) { described_class.new(connection_settings) }
9 
10    it_behaves_like "any connection", connection
24  end

Когда я пытаюсь запустить эту спецификацию, яполучить ошибку:

connection_spec.rb: 10: неопределенная локальная переменная или метод `connection 'для класса: 0xae8e5b8 (NameError)

Как передать параметр подключенияк it_behaves_like?

Ответы [ 5 ]

26 голосов
/ 05 апреля 2011

let () должен быть ограничен примерами блоков и не использоваться в других местах.Вы на самом деле не используете let () в качестве параметров.Причина, по которой он не работает с it_behaves_like в качестве параметра, связана с тем, как определяется let ().Каждая группа примеров в Rspec определяет пользовательский класс.let () определяет метод экземпляра в этом классе.Однако, когда вы вызываете it_behaves_like в этом пользовательском классе, он вызывает на уровне класса, а не из экземпляра.

Я использовал let () следующим образом:

shared_examples_for 'any connection' do
  it 'should have valid connection' do
    connection.valid?
  end
end

describe Connection do
  let(:connection) { Connection.new(settings) }
  let(:settings) { { :blah => :foo } }
  it_behaves_like 'any connection'
end

Я сделал нечто похожее на ответ bcobb, хотя редко использую shared_examples:

module SpecHelpers
  module Connection
    extend ActiveSupport::Concern

    included do
      let(:connection) { raise "You must override 'connection'" }
    end

    module ClassMethods
      def expects_valid_connection
        it "should be a valid connection" do
          connection.should be_valid
        end
      end
    end
  end
end

describe Connection do
  include SpecHelpers::Connection

  let(:connection) { Connection.new }

  expects_valid_connection
end

Определение этих общих примеров более многословно, чем использование общих примеров.Я думаю, что «it_behave_like» более неудобно, чем прямое расширение Rspec.

Очевидно, вы можете добавить аргументы в .expected_valid_connections

Я написал это, чтобы помочь классу rspec друга: http://ruby -lambda.blogspot.com / 2011/02 / agile-rspec-with-let.html ...

20 голосов
/ 05 апреля 2011

Отредактировано - полностью заглушено моим первым решением.Хо-Шен Сяо дал отличное объяснение, почему.

Вы можете дать it_behaves_like блок примерно так:

6 голосов
/ 15 ноября 2012

Я обнаружил, что если вы явно не передадите параметр, объявленный let, он будет доступен в общем примере.

Итак:

describe Connection do
  let(:connection) { described_class.new(connection_settings) }

  it_behaves_like "any connection"
end

соединение будетбыть доступным в спецификации общего примера

3 голосов
/ 09 апреля 2011

Я нашел то, что работает для меня:

   describe Connection do
     it_behaves_like "any connection", new.connection
     # new.connection: because we're in the class context 
     # and let creates method in the instance context, 
     # instantiate a instance of whatever we're in
   end
1 голос
/ 29 августа 2012

Это работает для меня:

  describe "numbers" do

    shared_examples "a number" do |a_number|
      let(:another_number) {
        10
      }

      it "can be added to" do
        (a_number + another_number).should be > a_number
      end

      it "can be subtracted from" do
        (a_number - another_number).should be < a_number
      end
    end

    describe "77" do
      it_should_behave_like "a number", 77
    end

    describe "2" do
      it_should_behave_like "a number", 2
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...