访问其他类的变量

时间:2014-06-19 21:27:42

标签: ruby-on-rails ruby rspec

我在上一篇文章(Undefined Method in rspec testing)上收到了一些很好的帮助,但我只是想寻求更多的帮助。

我有一个rspec集成规范,我基本上需要更改代码以获得所需的结果。我无法改变规范,因为它是演习的一部分。

let(:user) { User.new(voucher) }

context 'no voucher' do
  let(:voucher) { nil }

  it 'should bill default price all the time' do
      user.bill
      expect(user.orders[0].billed_for).to eql 6.95
      ... ...
  end
end

context 'vouchers' do
  describe 'default vouchers' do
    let(:voucher) { Voucher.create(:default, credit: 15) }

    it 'should not bill user if has a remaining credit' do
      user.bill
      expect(user.orders[0].billed_for).to eql 0.0
      ... ...
    end
  end

我放了一些点只是为了删除不必要的代码。

我非常了解这里发生的事情。

正在创建一个新用户类,并将其设置为:user in let。然后根据上下文启动凭证并传递凭证。没有为第一次测试设置优惠券。一个是第二个。

这是我的问题开始的地方

require 'order'
require 'voucher'

class User
  attr_accessor :voucher, :orders

  def initialize(orders = [], voucher = nil)
    @voucher = voucher
    @orders = [orders]
  end

  def bill
    new_order = Order.new(self)
    @orders << new_order
  end
end

该方法已初始化。它有可选参数。我对初始化的工作原理有点不清楚,因为我无法在任何地方访问这些设置变量。

我对范围限制有些不确定,但我希望从目前看起来像这样的订单类中访问一些优惠券变量

class Order
  DEFAULT_PRICE = 6.95

  attr_accessor :user

  def initialize(user)
    @user = user
  end

  def billed_for
    price = DEFAULT_PRICE
    user.orders.each do |order|
        price - order.billed_for
    end
    price
  end
end

shoudl访问用户凭证类就像user.voucher一样简单。 ??

也是一个较小的问题。我目前正在使用工厂方法,因此凭证类可以自行初始化。

 def self.create(type, *attrs)

* attrs参数本质上是一个数组。我可以遍历这个并通过检查它们的存在将它绑定到一些预期的变量。即如果数组具有某个键,则将该键的值设置为变量。这是最好的方式还是另一种流行的方式?

我知道这有很多要问,但我发现自己真的很困惑,如果有人能够清除这一点,我将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

对于User课程,您可以访问voucherorders个变量,因为它们是实例变量,并且由于顶部有attr_accessor而可公开访问。

对于您的工厂问题,我建议使用来自Butbot的 FactoryGirl ,这样可以非常轻松地构建Factory对象。您还可以使用Rails Fixtures ,它们是您创建的静态数据。

答案 1 :(得分:0)

原来我正在以错误的顺序初始化变量。这意味着我正在寻找错误课程中的项目。

令人尴尬的菜鸟错误!对它来说更好:)