2016-09-26 13 views
0

RubyでTDDを単純な再帰的Factorialでやろうとしています。私は単純なテストを実行しようとしていますが、NoMethodErrorを実行し続けます。私は何が間違っているのだろうと思っていたのですか?ここでRubyでテスト駆動開発をしようとするとNoMethodErrorが発生する

は私のfactorial_test.rb

require 'minitest/autorun' 
require './factorial.rb' 

class FactorialTest < MiniTest::Test 
    describe Factorial do 
    it "should provide factorial of 1 as 1" do 
     factorial(1).must_equal 1 
    end 
    end 
end 

、ここでは私のfactorial.rb

class Factorial 
    def factorial(number) 
    1 
    end 
end 

ですが、私はエラーを取得しておいてください。

`NoMethodError: undefined method `factorial' for #<#<Class:0x007fbaa5962d70>:0x007fbaa584a758>` 

私も追加してみましたセットアップ部分を私のfactorial_test.rbにします。

require 'minitest/autorun' 
require './factorial.rb' 

class FactorialTest < MiniTest::Test 
    def setup 
    @factorial = Factorial.new 
    end 

    describe Factorial do 
    it "should provide factorial of 1 as 1" do 
     factorial.factorial(1).must_equal 1 
    end 
    end 
end 

しかし、私はNameErrorで終わる:

`NameError: undefined local variable or method `factorial' for #<#<Class:0x007fc0e8996fc8>:0x007fc0e90ef1f8>` 

誰も私を助けてくださいことができる場合、私はそれをいただければ幸いです!

EDIT:

describe Factorial do 
    it "should provide factorial of 1 as 1" do 
     @factorial.factorial(1).must_equal 1 
    end 
    end 

は、私は別のエラーを取得:

以下の提案から修正を適用

NoMethodError: undefined method `factorial' for nil:NilClass 

を私は階乗を初期化しています方法に何か問題はありますクラス?

答えて

1

あなたの本能は正しい軌道にありました!

#factorialはインスタンスメソッドなので、インスタンス(別名Factorial.new)で呼び出す必要があります。

セットアップ方法に@factorial = Factorial.newを設定するために、あなたの変更を行うには正しいことだった、今、あなただけの@factorial上のメソッドを呼び出す必要があります:

@factorial.factorial(1).must_equal 1 

変数が@factorial命名されているため、あなたはundefined local variable or method 'factorial'を取得しています、単にfactorialではありません。あなたは@が必要です!

+0

ありがとう!私はそのエラーを渡しましたが、修正を適用すると 'NoMethodError:未定義メソッド' factorial 'for nil:NilClass'という新しいエラーが発生しています。私はそれを正しく設定していますか? – user3369494

+0

これで分かりましたが、インスタンス変数が設定されるようにセットアップメソッドを呼び出す必要があります。次に、そのインスタンス変数のメソッドを呼び出すことができます。 – hackrnaut

2

あなたはインスタンス変数を作成している:

def setup 
    @factorial = Factorial.new 
end 

をしかし、あなたはローカル変数にテストを呼び出している:

it "should provide factorial of 1 as 1" do 
    factorial.factorial(1).must_equal 1 
end 

は、作成したインスタンス変数にテストを呼び出してみてください。

it "should provide factorial of 1 as 1" do 
    @factorial.factorial(1).must_equal 1 
end 

:]

関連する問題