我需要为具有较深层次结构的模块中的类编写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
的实例,那么每次我都必须包含命名空间。
根据我的喜好,冗长的模块会降低可读性。当Formatter
或Message
使阅读更加困难时,只需MySite::FeatureX::Formatter
或MySite::FeatureY::DataTypes::Message
即可表达本质。是否有一种简单的惯用方法如何在测试上下文中引入类而不必为该类键入模块?
答案 0 :(得分:1)
您的规格很好,它只是让您绊倒的模块布局。
考虑更改模块/类的结构,以便于使用。
创建别名
MySite :: FeatureY :: DataTypes :: Messages => MS ::ÿ:: DT ::消息
它不漂亮,但实际上可能有所帮助。查看EventMachine,他们将长EventMachine
模块别名为EM
。 https://github.com/eventmachine/eventmachine/blob/master/lib/eventmachine.rb#L1543-L1546