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

比方说,我有汽车和机械师课。 汽车有“跑”的方法。 机械师出于某种原因需要汽车。 然后我写RSpec规格。 在机械师中,我定义了一个假的clas:

class Car; end

并稍后存根据机制使用的方法。 如果我单独运行测试,所有工作正常。 但是当我将两个测试一起运行时(rspec spec / directory /),我的机械规格使用真正的Car类。

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

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


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

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

希望这可以帮助你!


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

  • 单元规格:单独测试每个类
  • 集成规格:作为一个整体进行测试
  • 给定代码如下:

    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
    

    Rspec已经构建支持存根常量。

    链接地址: http://www.djcxy.com/p/66693.html

    上一篇: Best practice or workaround for RSpec specs faking class constants

    下一篇: Youtube as3 API seems not functional anymore