2014-06-19 129 views
1

我在最后一篇文章(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 

我放了一些小点只是为了剪掉不必要的代码。

我非常理解这里发生了什么。

正在创建一个新的用户类并将其设置为: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 

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

我有点不确定范围的限制,但正如我希望访问一些凭证变量从订单类目前看起来像这样

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参数本质上是一个数组。我可以通过这个循环来检查它们的存在并将它绑定到一些预期的变量。也就是说,如果数组有某个键,则将该键的值设置为一个变量。这是最好的方式,还是有另一种流行的方式?

我知道这是很多要问,但我发现自己真的很困惑,并会很感激,如果annyone可以清除我的任何这些。谢谢。

回答

0

对于User类,因为它们是实例变量和因attr_accessor顶部公开访问您可以访问voucherorders变量。

对于您的工厂问题,我建议FactoryGirl fromthoughbot它使建筑物对象非常容易。您也可以使用Rails 灯具这是您创建的静态数据。

+0

我只是有点不清楚我怎么会在另一个类访问这个。 user.voucher应该返回它的值是正确的?或者我错过了一些东西 – user3750194

+0

如果用户没有优惠券,它将返回“优惠券”对象或“无”。您可以将'voucher'分配给一个变量,然后使用该变量访问它的属性。 – CWitty

0

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

尴尬的noob错误!所有的更好:)