2016-09-26 61 views
0

我正在嘗試使用簡單的遞歸階乘在Ruby中執行TDD。我正試圖運行一個簡單的測試,但我一直運行到一個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>` 

如果任何人都可以請幫我,我將不勝感激!

編輯:

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 

你得到undefined local variable or method 'factorial'因爲變量命名爲@factorial,不只是factorial。你需要@

+0

謝謝!我得到了這個錯誤,但是當我應用修復時,我得到了一個新的錯誤,它說'NoMethodError:undefined method'factorial'for nil:NilClass'。我是否正確設置了它? – user3369494

+0

我很肯定你現在已經弄明白了,但是你應該調用你的setup方法來設置實例變量,然後你可以調用該實例變量的方法。 – 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 

:]