为具有if / else逻辑的方法添加RSpec覆盖率

时间:2019-07-02 01:21:14

标签: ruby-on-rails rspec rspec-rails

因此,我对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 :(得分:0)

  

您需要创建场景来测试代码的分支(if,   elsifelse

您可以做的是,可以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)。接收(:type)。然后返回“餐厅”

每当调用business.type时,

将返回一个“ Restaurant”字符串。

以相同的方式,您可以使此方法返回其他值(例如“ Bar”)并检查您的elsif情况。

希望有帮助。