gpt4 book ai didi

ruby-on-rails - 如何测试优惠券/促销代码的唯一性?

转载 作者:行者123 更新时间:2023-12-04 06:15:50 26 4
gpt4 key购买 nike

我有一个模型 PromoCode,它有一个 .generate! 方法,它调用 .generate,它使用 SecureRandom 生成一个字符串.hex(5) 并将其保存到数据库中:

class PromoCode < ActiveRecord::Base
class << self
def generate
SecureRandom.hex 5
end

def generate!
return create! code: generate
end
end
end

现在我想编写一个规范来测试生成的字符串的唯一性。只要生成了不存在的 PromoCode,就应该调用 .generate 方法。

我不确定如何执行此操作,因为我无法真正去除 .generate 方法以返回固定值(因为那样它会陷入无限循环)。

这是到目前为止模型的通过规范:

describe PromoCode do
describe ".generate" do
it "should return a string with a length of 10" do
code = PromoCode.generate
code.should be_a String
code.length.should eql 10
end
end

describe ".generate!" do
it "generates and returns a promocode" do
expect {
@promo = PromoCode.generate!
}.to change { PromoCode.count }.from(0).to(1)

@promo.code.should_not be_nil
@promo.code.length.should eql 10
end

it "generates a uniq promocode" do
end
end
end

感谢任何指示。

最佳答案

Rspec 的 and_return 方法允许您指定将循环通过的多个返回值

例如你可以这样写

PromoCode.stub(:generate).and_return('badcode1', 'badcode2', 'goodcode')

这将导致第一个调用生成返回“badcode1”,第二个调用“badcode2”等...然后您可以检查返回的促销代码是否使用正确的代码创建。

如果你想成为竞争条件证明,你需要一个数据库唯一性约束,所以你的代码可能真的想要成为

def generate!
create!(...)
rescue ActiveRecord::RecordNotUnique
retry
end

在您的规范中,您将 stub 创建!第一次引发但第二次返回值的方法

关于ruby-on-rails - 如何测试优惠券/促销代码的唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901209/

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