7

假设我有汽车和机械师课程。车有“跑”的方法。机械师出于某种原因需要汽车。然后我编写 RSpec 规范。在 mechanic 我定义了一个这样的假类:

class Car; end

然后存根机械师在其上使用的方法。如果我单独运行测试,一切正常。但是当我同时运行两个测试时(rspec spec/directory/),我的 Mechanic 规格使用真正的 Car 类。

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

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

4

3 回答 3

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
于 2012-11-28T18:49:47.707 回答
2

由于 Ruby 类是开放的,因此这个假类将无法工作。

您可以使用的一种方法是使用let以您想要的方式初始化对象,并在需要时使用 before 块上的关系。在 before 块中也欢迎存根。=p

希望这对你有帮助!

于 2012-11-28T17:59:37.377 回答
-1

Rspec 内置了对存根常量的支持。

于 2015-01-16T12:30:48.040 回答