RSpec 干双倍
DRY double in RSpec
如何 DRY(不要重复自己)RSpec 中的替身?例如:
let(:s1) {instance_double(Class1,
:attr1 => val1,
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
let(:s2) {instance_double(Class1,
:attr1 => val0, # the only difference between s2 and s1
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
let(:s3) {instance_double(Class1,
:attr1 => val6, # the only difference between s3 and s1
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
这3个替身很相似,看来我们可以重构。但我试过了:
为他们做一个基本的散列:
basic_hash = {attr2 => val2, attr3 => val3, attr4 => val4, attr5 => val5}
然后修改这个基本的hash,传入instance_double,比如传入:s1
:
basic_hash_s1 = basic_hash.clone
basic_hash_s1[:attr1] = val1
let(:s3) {instance_double(Class1, basic_hash_s1)
但这不起作用。我正在处理一个现有项目,Rspec 没有给出任何错误消息(也许该项目有一些设置?),它只是跳转了整个规范文件。
我也试过允许加倍:
允许(s1).接收(:attr).and_return(val1)
还是不行。
有人知道如何重构这个吗?谢谢!
=======编辑=======
我试过创建double Hash对象传给:s1
,可以传,但是不知道怎么修改那个double里面的内容:我试过修改成一样的就像修改常规 Hash 对象一样,但它不起作用。
使用函数
let(:create_s) do
-> |attr1| do
instance_double(Class1,
:attr1 => attr1
:attr2 => val2
:attr3 => val3
:attr4 => val4
:attr5 => val5)
end
end
let(:s1) { create_s.call(val1) }
let(:s2) { create_s.call(val0) }
let(:s3) { create_s.call(val6) }
let(:opts) { { :attr1 => val1,
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5 } }
let(:s1) { instance_double(Class1, opts) }
let(:s2) { instance_double(Class1, opts.merge(:attr1 => val0)) }
let(:s3) { instance_double(Class1, opts.merge(:attr1 => val6)) }
如何 DRY(不要重复自己)RSpec 中的替身?例如:
let(:s1) {instance_double(Class1,
:attr1 => val1,
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
let(:s2) {instance_double(Class1,
:attr1 => val0, # the only difference between s2 and s1
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
let(:s3) {instance_double(Class1,
:attr1 => val6, # the only difference between s3 and s1
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5)}
这3个替身很相似,看来我们可以重构。但我试过了:
为他们做一个基本的散列:
basic_hash = {attr2 => val2, attr3 => val3, attr4 => val4, attr5 => val5}
然后修改这个基本的hash,传入instance_double,比如传入:s1
:
basic_hash_s1 = basic_hash.clone
basic_hash_s1[:attr1] = val1
let(:s3) {instance_double(Class1, basic_hash_s1)
但这不起作用。我正在处理一个现有项目,Rspec 没有给出任何错误消息(也许该项目有一些设置?),它只是跳转了整个规范文件。
我也试过允许加倍:
允许(s1).接收(:attr).and_return(val1)
还是不行。
有人知道如何重构这个吗?谢谢!
=======编辑=======
我试过创建double Hash对象传给:s1
,可以传,但是不知道怎么修改那个double里面的内容:我试过修改成一样的就像修改常规 Hash 对象一样,但它不起作用。
使用函数
let(:create_s) do
-> |attr1| do
instance_double(Class1,
:attr1 => attr1
:attr2 => val2
:attr3 => val3
:attr4 => val4
:attr5 => val5)
end
end
let(:s1) { create_s.call(val1) }
let(:s2) { create_s.call(val0) }
let(:s3) { create_s.call(val6) }
let(:opts) { { :attr1 => val1,
:attr2 => val2,
:attr3 => val3,
:attr4 => val4,
:attr5 => val5 } }
let(:s1) { instance_double(Class1, opts) }
let(:s2) { instance_double(Class1, opts.merge(:attr1 => val0)) }
let(:s3) { instance_double(Class1, opts.merge(:attr1 => val6)) }