【问题标题】:ArgumentError in rspecrspec 中的参数错误
【发布时间】:2026-01-18 16:40:01
【问题描述】:

我想用 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)>'

为什么?我将规范代码移动到类文件中,它可以解决。怎么了?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    信不信由你,问题在于您的 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,结果是一个非常神秘的错误。

    【讨论】:

    • 非常感谢。愚蠢的我。该消息确实很神秘,而且有点误导......我试图找出我的初始化程序出了什么问题,而不是仔细检查规范本身。