gpt4 book ai didi

ruby - 通过继承的 Rspec 常量

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

我有一个 ruby 应用。

一类是:

module Transfer
class Base
(...)
private

def substract_commissions
sender_account.commission INTER_BANK_COMMISSION
end
end

另一个:

module Transfer
class InterBank < Base
INTER_BANK_COMMISSION = 5.00

private

(...)
end
end

我正在使用 Rspec 测试类 Base。

在某些时候,我需要检查 sender_account 是否可以收到带有参数的佣金:

期望(sender_account).to receive(:commission).with(the_constant)

问题是常量是在他的“儿子” InterBank 上定义的正如预期的那样,它抛出了这个错误:

 NameError:
uninitialized constant Transfer::Base::INTER_BANK_COMMISSION

我该如何解决这个问题?

最佳答案

您还没有定义INTER_BANK_COMMISIONBase ,因此您需要通过定义它的类来引用它。因为您在 Transfer 中模块,你应该可以使用 InterBank::INTER_BANK_COMMISSION ,您始终可以将其完全限定为 Transfer::InterBank::INTER_BANK_COMMISSION .


顺便提一下,您应该仔细看看您的设计。您在父类(super class) ( InterBank ) 中引用子类 ( Base 的) 常量,这不必要地将父类(super class)与其子类耦合。一个子类应该严格地是它的父类(super class)的特化,像删除子类这样的修改不应该要求改变父类(super class)——在这种情况下,INTER_BANK_COMMISSION会消失并且没有任何东西继承自 Base将能够 subtract_commission不再。

避免依赖的一个干净的方法是离开Base#subtract_commissions空,然后在 InterBank 中覆盖它:

class Base
private

def subtract_commission
# No default commission
end
end

class InterBank < Base
INTER_BANK_COMMISSION = 5.00

private

def subtract_commission
sender_account.commission INTER_BANK_COMMISSION
end
end

这边,BaseInterBank一无所知并且没有佣金,并且InterBank独立减去其转账类型特别需要的佣金。

佣金扣除行为看起来将由 Base 的许多子类共享。 , 所以你可以提升备份并让子类只需要声明他们的佣金:

class Base
private

def commission
0
end

def subtract_commission
sender_account.commission commission
end
end

class InterBank < Base
INTER_BANK_COMMISSION = 5.00

private

def commission
INTER_BANK_COMMISSION
end
end

现在您不需要在每个子类中重新实现减法,每个子类只声明佣金金额及其转账费用类型。新的子类很容易定义并且相互独立。

如果需要,您甚至可以直接引用每个类的常量,而不需要commission。方法。

class Base
COMMISSION = 0.00

private

def subtract_commission
sender_account.commission self.class::COMMISSION
end
end

class InterBank
COMMISSION = 5.00
end

self.class解析为 BaseInterBank , 然后每个定义自己的 COMMISSION .这很好,因为现在您可以像 <class>::COMMISSION 一样引用任何佣金。 ,而不是拥有多余的 InterBank::INTER_BANK_COMMISSION名字。

关于ruby - 通过继承的 Rspec 常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33711805/

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