2009-06-12 48 views
10

我正在向我的應用添加更多rspec測試,並且想要測試/lib/scoring_methods.rb中的ScoringMethods模塊。所以我添加了一個/ spec/lib目錄並在那裏添加了scoring_methods_spec.rb。我需要spec_helper,併成立了描述塊像這樣:爲庫模塊添加rspec測試似乎沒有取得預期和匹配

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    methods = ScoringMethods.instance_methods 
    methods[0].should match(/scorePublicContest/) 
    end 
end 

現在methods[0]是一個String,並沒有與正則表達式匹配的公共方法的名稱問題。 「spec_helper」的相對路徑是正確的。

問題是整個安裝程序似乎沒有使用rspec庫。 運行示例產量:

./spec/lib/scoring_methods_spec.rb:7: undefined method `match' for Spec::Rails::Example::RailsExampleGroup::Subclass_1::Subclass_1:Class (NoMethodError) 
    ... 

整個期望和匹配器支持似乎缺少。爲了測試我的假設,我通過將「is_instance_of」替換爲「is_foobar_of」來更改了工作幫助程序規範。該測試只是失敗,並說「is_foobar_of」不是目標對象的一種方法;它,這整個Spec :: Rails :: Example ...層次結構不存在。

我試過使用其他匹配器。我試過了「be_instance_of」和其他一些。看來我沒有正確包含rspec庫。

最後,ScoringMethods是一個模塊,就像Helpers是模塊一樣。所以我認爲可以測試一個模塊(而不是類,如控制器和模型)。

我非常感謝您對我做錯了什麼的想法。也許有更有效的方法來測試庫模塊?謝謝!

回答

11

您應該將您的測試塊包含在「it」塊中。例如:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    it "should have a scorePublicContest method" do 
     methods = ScoringMethods.instance_methods 
     methods[0].should match(/scorePublicContest/) 
    end 
    end 
end 

您會發現返回的方法名不能保證它們在文件中存在的順序。

我們在測試模塊時經常使用的模型是將模塊包含在爲測試而創建的類中(在spec文件中)或包含在spec中。

+1

馬克, 非常感謝您的回覆。你是絕對正確的!我沒有「it」塊。非常感謝, 彼得 – 2009-06-16 13:23:59

相關問題