【问题标题】:Rspec Outside-In testing a .run methodRspec Outside-In 测试 .run 方法
【发布时间】:2015-11-06 05:38:44
【问题描述】:

我在建模我的测试以从 .run 方法到应用程序的内部工作时遇到问题。

.run 方法是尚未编写的应用程序的唯一入口点。您在下面看到的只是它如何工作的快速模型。

.run 基本上是一个工厂,它创建Car 的实例,添加一些车轮和门,最后返回汽车的字符串表示形式。

因此,我不确定如何编写我的第一个测试以开始。

class Car
  attr_accessor :wheels, :doors

  def initialize
    @wheels = []
    @doors = []
  end

  def self.run(wheels, doors)
    car = Car.new
    car.wheels = Car::Wheel.load_json(wheels)
    car.doors = Car::Door.load_json(doors)
    car.build.to_s
  end
end

Car.run(wheels_json, doors_json)

我的一些想法:

  • 我可以编写一个集成测试,但这并不能真正推动开发,因为集成测试只会检查调用.run,其中包含两个变量(轮子和门),其中包含 json 内容,会吐出一个字符串表示一辆车。我必须编写大量代码才能通过该测试。
  • 如果.run 返回Car 的实例,我可以通过抓取返回的实例进行测试,但我不能这样做,因为该方法返回一个字符串。

明确地说,问题是:鉴于上述代码,您将如何开始测试以帮助您降低并构建应用程序的其余部分。

【问题讨论】:

    标签: ruby testing rspec tdd


    【解决方案1】:

    单元测试的基本原则是每个单元(Car::WheelCar::Door)应该单独测试。当您组合两个类时,您可以确定底层元素已正确实现。

    您应该拥有单一职责的方法,而不是 run 方法(只构建而不是构建和序列化):

      def self.build(wheels, doors)
        car = Car.new
        car.wheels = Car::Wheel.load_json(wheels)
        car.doors = Car::Door.load_json(doors)
        car
      end
    
      def self.run(wheels, doors)
        self.build.to_s
      end
    

    这样您就可以轻松地测试build 方法的输出,因为它返回一个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多