1

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

どうして??仕様コードをクラス ファイルに移動すると、うまくいきます。なにが問題ですか?

4

1 に答える 1

2

信じられないかもしれませんが、問題は rspec に 2 つのドットがないことです。これらの行:

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引数なしでは機能しないため、これは爆発します。少なくとも 1 つ必要です。should暗黙の主語でa を書くつもりがなかった場合、結果はかなりわかりにくいエラーになります。

于 2012-06-04T03:12:38.290 に答える