Добавление покрытия RSpec для метода с логикой if / else - PullRequest
0 голосов
/ 02 июля 2019

Так что я довольно новичок в RSpec и Rails, и я стараюсь изучать RSpec как можно больше, и я действительно изо всех сил пытаюсь реализовать покрытие для методов, которые содержат логику в них.

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

def initialize_business
  businesses.each do |business|
    if business.type == 'Restaurant'
      @business_type = Business::Restaurant.new(json_directory: 'restaurant.json')
    elsif business.type = 'Bar'
      @business_type = Business::Bar.new(json_directory: 'bar.json')
    else
      @business_type = Business::Other.new(json_directory: 'other_business.json')
    end
  end
  business_type = @business_type
  initialize_business_creator(business_type)
end

Моя первоначальная попытка предоставить покрытие (исключив другие несвязанные спецификации), но я изо всех сил пытался даже реализовать какое-либо покрытие, так как я слишком новичок в RSpec:

describe '#initialize_business' do
    subject do
      described_class.new([business], business_sample_file).
      initialize_business_creator
    end

    it 'assigns a value to @business_type' do
      expect(assigns(@business_type)).to_not be_nil
    end
  end
end

Я просто ищу помощь и / или руководство о том, как реализовать спецификации для такого метода, и я ценю любую помощь. Спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

Вам нужно создать сценарии для проверки веток вашего кода (if, elsif, else)

Что вы можете сделать, вы можете mock метод, который возвращает type для получения желаемых результатов.

Например, если вы хотите проверить, что ваше условие if оценивается, и код в этой ветви имеет видВыполнить успешно.

Вы можете сделать что-то вроде этого:

describe '#initialize_business' do
    subject do
      described_class.new([business], business_sample_file).
      initialize_business_creator
    end

    it 'assigns a value to @business_type' do
      expect(assigns(@business_type)).to_not be_nil
    end

    context "when business type is 'Restaurant'" do
        before { allow_any_instance_of(Business).to receive(:type).and_return "Restaurant"
    end

    it "should create data from restaurant.json" do
        //here you can write expectations for your code inside if statement

    end
  end
end

Строка:

allow_any_instance_of (Business). получать (: тип) .and_return"Restaurant"

будет возвращать строку "Restaurant" всякий раз, когда вызывается business.type.

Таким же образом, вы можете сделать этот метод для возврата других значений, таких как "Bar" ипроверьте ваш elsif сценарий.

Надеюсь, это поможет.

...