当我运行整个测试套件时,MyClass.inspect返回不正确的类

时间:2016-11-25 09:10:42

标签: ruby-on-rails ruby rspec activemerchant value-objects

当我运行整个测试套件时,

MyClass.inspect返回不正确的类。

问题:

项目中有template <typename T> class Myclass { public: T sum; T func(T A,T... B) { sum+=A; func(B...); } T func(T A) { sum+=A; return sum; } }; int main() { Myclass<int> myclass; cout<<myclass.func(12,11,11,23); return 0; } User::CreditCard个类。最后来自activemerchant gem。 当我运行单一规格(ActiveMerchant::Billing::CreditCard)时,它可以正常工作 当我运行整个套件(rspec spec/models/user/credit_card_spec.rb)时,规格会失败并显示rspec spec,这无关紧要。 问题在于,在这种情况下,我的undefined method...课程不是我的!
当我运行单一规范并执行CreditCard(或只是puts User::CreditCard.inpsect,或只是p User::CreditCard时),它会按预期返回User::CreditCard当我运行整个套件并在规范中执行User::CreditCard时,它会返回p User::CreditCard

背景:

如果您不想阅读“背景”,请确保最后有注意

我正在使用遗留代码。所以我不完全了解图像的所有部分。

我想在我的用户中为信用卡创建ActiveMerchant::Billing::CreditCard。所以我创建了新的无表格模型(注意路径和类名):

Value Object

当然我有用户模型:

#app/models/user/credit_card.rb
class User::CreditCard
  include ActiveModel::Model

  delegate :card_number, :card_expiration, :card_type, to: :subscription

  def initialize(subscription)
    @subscription = subscription || Subscription.new
  end

  private

  attr_reader :subscription
end

我对user / credit_card的规格:

#app/models/user.rb
class User
  ...
  has_one :subscription
  ...
  def credit_card
    @credit_card ||= User::CreditCard.new(subscription)
  end
end

注意:

在规范中我可以要求'user / credit_card'然后它会工作。但是为什么没有它它不起作用? 它可能是另一个地方的问题吗?例如在控制器或其他地方?

1 个答案:

答案 0 :(得分:1)

这是轨道自动加载+红宝石恒定分辨率的故障。

class C; end
CONST = 42
C::CONST
#⇒ (pry):3: warning: toplevel constant CONST referenced by C::CONST
#⇒ 42

令人惊讶的是,CONST 已得到解决。那是因为Ruby constant resolution algorithm

有一个选项可以解决问题:要么为类User::CreditCard指定一个不同的名称,要么确保它已加载。否则Rails会在CreditCard命名空间中找到常量ActiveMerchant::Billing,并且很高兴使用它