我正在尝试为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>
答案 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"。
我尝试通过以下微小更改来规划所有三种方案:
#the_method
更改为super
,因此不会与Object#method
OpenStruct
来表示#a
返回的对象,因为我所知道的是它是一个包含方法#b
和module 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