在红宝石中测试mixin

时间:2015-05-28 00:35:44

标签: ruby-on-rails ruby rspec

我正在尝试为mixin类编写rspec测试。我有以下内容。

 module one
  module two

    def method
      method_details = super
      if method_details.a && method_details.b
         something
      elsif method_details.b
        another thing
      else
        last thing
      end
    end

  end
end

现在我嘲笑了"方法"将传递给类的对象。 但我正在努力获取超级方法。 我做了,

let(:dummy_class) { Class.new { include one::two } }

如何将模拟的method对象传递给这个虚拟类?

我该如何测试?对红宝石来说,有人可以向我展示这个方向。

提前致谢。

更新:

我试过了,

let(:dummy_class) {
    Class.new { |d|
      include one::two
      d.method = method_details
    }
  }

let (:method_details){
'different attributes'
}

仍然无法运作。我得到undefined local variable or method method_details for #<Class:0x007fc9a49cee18>

2 个答案:

答案 0 :(得分:0)

我亲自测试与课堂混音。因为混合(模块)本身没有意义,除非它附加到类/对象。

前:

didTransition: function() {
    var metadata = routeMetaData[this.routeName];
}

所以我相信你应该测试你的模块附加到相关的类/对象。

如何this is a different perspective on testing mixings

HTH

答案 1 :(得分:0)

我认为在您的规范中,您需要明确提供超级类定义,以便在super#method调用#method作为"you can't mock super and you shouldn't"

我尝试通过以下微小更改来规划所有三种方案:

  • 稍微更改了您的示例代码以成为有效的Ruby
  • #the_method更改为super,因此不会与Object#method
  • 冲突
  • 使用OpenStruct来表示#a返回的对象,因为我所知道的是它是一个包含方法#bmodule One module Two def the_method method_details = super if method_details.a && method_details.b 'something' elsif method_details.b 'another thing' else 'last thing' end end end end RSpec.describe One::Two do require 'ostruct' let(:one_twoable) { Class.new(super_class) { include One::Two }.new } describe '#the_method' do let(:the_method) { one_twoable.the_method } context 'when method_details#a && method_details#b' do let(:super_class) do Class.new do def the_method OpenStruct.new(a: true, b: true) end end end it 'is "something"' do expect(the_method).to eq('something') end end context 'when just method#b' do let(:super_class) do Class.new do def the_method OpenStruct.new(a: false, b: true) end end end it 'is "another thing"' do expect(the_method).to eq('another thing') end end context 'when neither of the above' do let(:super_class) do Class.new do def the_method OpenStruct.new(a: false, b: false) end end end it 'is "last thing"' do expect(the_method).to eq('last thing') end end end end 的对象。您可以根据实际规格进行更改

将下面的类和规范复制并粘贴到文件中并试一试:

Option