我想在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)>'
为什么?我将规范代码移动到类文件中,然后就可以了。有什么问题?
答案 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
,则结果会出现相当神秘的错误。