2012-06-04 8 views
1

루비에 트리 데이터 구조를 쓰고 싶습니다. 클래스 파일 :rspec의 ArgumentError

class Tree 
    attr_accessor :node, :left, :right 
    def initialize(node, left=nil, right=nil) 
    self.node=node 
    self.left=left 
    self.right=right 
    end 
end 

RSpec에 파일을

require 'init.rb' 

describe Tree do 
    it "should be created" do 
    t2=Tree.new(2) 
    t1=Tree.new(1) 
    t=Tree.new(3,t1,t2) 
    t.should_not be nil 
    t.left.node should eql 1 
    t.right.node should eql 2 
    end 
end 

RSpec에 불평 유지 :

1) Tree should be created 
    Failure/Error: t.left.node should eql 1 
    ArgumentError: 
     wrong number of arguments (0 for 1) 
    # ./app/tree.rb:3:in `initialize' 
    # ./spec/tree_spec.rb:9:in `block (2 levels) in <top (required)>' 

왜? spec 코드를 클래스 파일로 옮기면 작동합니다. 뭐가 잘못 되었 니?

답변

2

믿거 나 말거나, 문제는 rspec에 두 개의 누락 된 점입니다. 이 라인 :

t.left.node should eql 1 
t.right.node should eql 2 

이 같아야합니다

t.left.node.should eql 1 
t.right.node.should eql 2 

should 전에 그 기간을 삽입하고 사양을 통과해야한다.

다음은 무슨 일입니까? should 방법은 임의의 값에 작동하지만,이 같은 노출을 호출하는 경우 :

should == "hello" 

를이 테스트의 주제에 작동합니다. 주제는 무엇입니까? 자, subject 메서드를 사용하여 원하는 대상을 설정할 수 있지만, 그렇지 않은 경우 rspec은 대상이 설명되는 클래스의 인스턴스라고 가정합니다. 그것은 당신의 스펙의 상단에이를보고 :

describe Tree 

이 같은 주제 만들려고 : 당신의 initialize가 인수없이 작동하지 않습니다 때문에,

Tree.new 

불면; 적어도 하나는 필요합니다. 암시 적 주제와 함께 should을 쓰지 않으려 고한다면 결과는 꽤 이상한 오류입니다.

+0

감사합니다. 바보 야. 이 메시지는 정말로 비밀스럽고 약간 잘못된 것입니다. 필자는 스펙 자체를 다시 확인하는 대신 초기 설정자에 무엇이 잘못되었는지 알아 내려고했습니다. – lkahtz