2014-06-19 3 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 : in의 user로 설정하고 있습니다. 그런 다음 문맥에 따라 바우처가 초기화되고 전달됩니다. 바우처는 첫 번째 테스트를 위해 설정되지 않습니다. 하나는 두 번째로 설정됩니다. 내 질문

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 클래스의 경우 voucherorders 변수는 인스턴스 변수이며 상단의 attr_accessor로 인해 공개적으로 액세스 할 수 있으므로 변수에 액세스 할 수 있습니다.

공장 문제로는 Factory 객체를 매우 쉽게 제작할 수 있도록 Thoughbot의 FactoryGirl을 권장합니다. 또한 사용자가 작성한 정적 데이터 인 레일 Fixtures을 사용할 수 있습니다.

+0

나는 다른 클래스에서 이것을 어떻게 접근 할 것인가에 대해서는 조금 불분명하다. user.voucher는 값을 반환해야합니다. 아니면 무언가가 누락되었습니다. – user3750194

+0

사용자에게 바우처가 없으면'voucher' 객체를 반환하거나'nil'을 반환합니다.변수에'바우처 (voucher) '를 할당 한 다음 변수를 사용하여 속성에 액세스 할 수 있습니다. – CWitty

0

나는 변수를 잘못된 순서로 초기화했다. 이것은 잘못된 수업에서 항목을 찾고 있음을 의미합니다.

멍청한 놈 실수! 더 나은 모든 걸 :)

관련 문제