如何在rspec中包含类的范围?

时间:2014-04-15 14:14:24

标签: ruby unit-testing rspec

我需要为具有较深层次结构的模块中的类编写rspec测试。每次我需要创建一个类的实例时,我最终都会输入模块名称。例如

档案my_site/feature_x/formatter.rb

module MySite
  module FeatureX
    class Formatter
      def format(message)
        "#{message.from} to #{message.to}: #{message.body}"
      end
    end
  end
end

档案my_site/feature_y/data_types/message.rb

module MySite
  module FeatureY
    module DataTypes
      class Message
        attr_accessor :from, :to, :body
      end
    end
  end
end

档案spec/my_site/feature_x/formatter_spec.rb

require 'my_site/feature_x/formatter'
require 'my_site/feature_y/data_types/message'

describe MySite::FeatureX::Formatter do
  let (:formatter) { MySite::FeatureX::Formatter.new }

  context "#format" do
    it "should format message" do
      msg = MySite::FeatureY::DataTypes::Message.new
      msg.from = "me"
      msg.to = "you"
      msg.body = "hello"
      res = formatter.format(msg)
      expect(res).to eq("me to you: hello")
    end
  end
end

在此示例中,我可以在msg中声明let,但仍需要输入其完整的命名空间。如果我需要更多Message的实例,那么每次我都必须包含命名空间。

根据我的喜好,冗长的模块会降低可读性。当FormatterMessage使阅读更加困难时,只需MySite::FeatureX::FormatterMySite::FeatureY::DataTypes::Message即可表达本质。是否有一种简单的惯用方法如何在测试上下文中引入类而不必为该类键入模块?

1 个答案:

答案 0 :(得分:1)

您的规格很好,它只是让您绊倒的模块布局。

  1. 考虑更改模块/类的结构,以便于使用。

  2. 创建别名

    MySite :: FeatureY :: DataTypes :: Messages => MS ::ÿ:: DT ::消息

    它不漂亮,但实际上可能有所帮助。查看EventMachine,他们将长EventMachine模块别名为EMhttps://github.com/eventmachine/eventmachine/blob/master/lib/eventmachine.rb#L1543-L1546