RSpec规范伪造类常量的最佳实践或解决方法

时间:2012-11-28 17:53:37

标签: ruby unit-testing testing rspec

假设我有课程Car and Mechanic。汽车有“跑”的方法。机修工出于某种原因需要汽车。然后我写了RSpec规范。在机械师中,我定义了一个像这样的虚假clas:

class Car; end

然后将技工使用的方法存根。如果我单独进行测试,一切正常。但是当我同时运行两个测试(rspec spec / directory /)时,我的Mechanic规范使用真正的Car类。

因此。我想这是因为ruby类是“开放的”而且我已经为Car规格加载了一次类。但是有更好的方法吗?这种情况的最佳做法是什么?这是否意味着我的代码需要一些改进,因为它可能紧密耦合?

我在github上做了一个快速演示:https://github.com/depy/RspecTest

3 个答案:

答案 0 :(得分:2)

由于Ruby Classes是开放的,这个假类不会工作。

您可以使用的一种方法是使用let按照您想要的方式初始化对象,如果需要,可以使用前一个块上的关系。在前面的街区内也欢迎存根。 = p

希望这能帮到你!

答案 1 :(得分:2)

我认为您需要的是双层测试:

  • 单位规格:单独测试每个班级
  • 集成规范:整体测试

给出如下代码:

class Car
end

class Mechanic
  def fix(car)
    # do something here
  end
end

对于单位规格,我会存在依赖关系,例如:

describe Mechanic do
  let(:mechanic) { described_class.new }
  let(:car)      { stub(stubbed_method_on_car: 14) } # Or just OpenStruct.new(stubbed_method_on_car: 14)

  it 'does some stuff' do
    mechanic.fix(car).should eq true
  end
end

对于集成规范,我会这样做:

describe Mechanic do
  let(:mechanic) { FactoryGirl.create(:mechanic) }
  let(:car)      { FactoryGirl.create(:car) }

  it 'does some stuff' do
    mechanic.fix(car).should eq true
  end
end

答案 2 :(得分:0)

Rspec内置了对stubbing constants的支持。