gpt4 book ai didi

ruby - RSpec 中的 DRY 双倍

转载 作者:数据小太阳 更新时间:2023-10-29 08:25:54 27 4
gpt4 key购买 nike

如何 DRY(不要重复自己)RSpec 中的 double?例如:

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 个 double 非常相似,看来我们可以重构。但我试过了:

  1. 为他们做一个基本的散列:

    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 没有给出任何错误消息(也许该项目有一些设置?),它只是跳转了整个规范文件。

  1. 我也试过允许 on double:

    允许(s1).接收(:attr).and_return(val1)

还是不行。

有人知道如何重构这个吗?谢谢!

=======编辑=======

我试过创建double Hash对象,传给:s1,可以传,但是不知道怎么修改那个double里的内容:我试过修改为与修改常规 Hash 对象的方式相同,但它不起作用。

最佳答案

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)) }

关于ruby - RSpec 中的 DRY 双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com