rspec @variable возвращая ноль - PullRequest
0 голосов
/ 03 марта 2019

У меня проблема с моей переменной @attributes.Я хотел бы, чтобы он был доступен, чтобы сохранить мой код сухим, но в настоящее время я должен пересчитать переменную и установить ее в «значения», чтобы мой тест rspec заработал.Какой лучший способ сделать это без дублирования значений.

ref: Неожиданная переменная nil в RSpec

Показывает, что она не доступна в описании, но есть необходимостьбыть другим решением.Когда «уточнить» будет уместно?Я не использовал его.

describe "When one field is missing invalid " do 
    before(:each) do 
        @user = create(:user)
        @attributes = {"has_car"=>"true", "has_truck"=>"true", "has_boat"=>"true", "color"=>"blue value", "size"=>"large value"}
    end
  values = {"has_car"=>"true", "has_truck"=>"true", "has_boat"=>"true", "color"=>"blue value", "size"=>"large value"}
  values.keys.each do |f|
    p = values.except(f) 
    it "returns invalid when #{f.to_s} is missing" do 
              cr = CarRegistration::Vehicle.new(@user, p)
        cr.valid?
    end
  end
end

Обновление на основе комментариев: я также хотел бы использовать хэш массива значений в других тестах.Если бы я поместил это в цикл, как указано, мне все равно пришлось бы повторить это в других местах.Любые другие рекомендации?

Обновление: я пытался использовать let (),

  describe "When one field is missing" do

        let(:user) {Factorybot.create(:user)}
        let(:attributes) = {{"has_car"=>"true", "has_truck"=>"true", "has_boat"=>"true", "color"=>"blue value", "size"=>"large value"}}

      attributes do |f|
        p = attributes.except(f) 
        it "returns invalid when #{f.to_s} is missing" do 
                  cr = CarRegistration::Vehicle.new(user, p)
            cr.valid?
        end
      end
  end

, но получил следующую ошибку.

attributes недоступен в группе примеров(например, блок describe или context).Он доступен только из отдельных примеров (например, it блоков) или из конструкций, которые выполняются в объеме примера (например, before, let и т. Д.).

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

В любом из ваших фрагментов вам не нужно attributes внутри ваших спецификаций.Это данные для генерации спецификаций.Таким образом, он должен жить на один уровень выше.

describe "When one field is missing" do

  let(:user) { Factorybot.create(:user) }

  attributes = { "has_car" => "true", "has_truck" => "true", "has_boat" => "true", "color" => "blue value", "size" => "large value" }

  attributes do |f|
    p = attributes.except(f)
    it "returns invalid when #{f.to_s} is missing" do
      cr = CarRegistration::Vehicle.new(user, p)
      cr.valid?
    end
  end
end
0 голосов
/ 06 марта 2019

Использование let

describe "When one field is missing" do
  let(:user) {Factorybot.create(:user)}
  let(:attributes) = {{"has_car"=>"true", "has_truck"=>"true", "has_boat"=>"true", "color"=>"blue value", "size"=>"large value"}}
  ## The variables are used INSIDE the it block.
  it "returns invalid when a key is missing" do
    attributes do |f|
      p = attributes.except(f)
      cr = CarRegistration::Vehicle.new(user, p)
      expect(cr.valid?).to eq(true)  # are you testing the expectation? Added this line.    
    end
  end
end

Лично мне не нравится писать тесты (как выше), которые могут быть неудачными по нескольким причинам.Серхио прав.Но если вы хотите использовать let, вы должны использовать его из WITHIN блока it - этот пример показывает это.

0 голосов
/ 03 марта 2019

Как вы, похоже, поняли, основываясь на другой публикации SO, на которую вы ссылались, вы не можете ссылаться на переменные вашего экземпляра в блоке description.Просто установите его как локальную переменную, как вы сделали.

...