rspec中的ArgumentError

时间:2012-06-04 01:47:25

标签: ruby rspec

我想在ruby中编写一些树数据结构。类文件:

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)>'

为什么?我将规范代码移动到类文件中,然后就可以了。有什么问题?

1 个答案:

答案 0 :(得分: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

并尝试创建一个这样的主题:

Tree.new
由于你的initialize在没有任何争论的情况下无效,所以会爆炸。它至少需要一个。如果您不打算使用隐式主题编写should,则结果会出现相当神秘的错误。