2015-01-11 57 views
4

沒有MINITEST /規格,測試看起來像這樣,和my_engine_customers夾具被加載(所有的孔):NoMethodError <夾具名稱>在導軌和MINITEST /規格

my_engine/test/models/my_engine/customer_test.rb

require 'test_helper' 

module MyEngine 
    class CustomerTest < ActiveSupport::TestCase 

    test "alex is id 5" do 
     assert my_engine_customers(:alex).id, 5 
    end 

    end 
end 

require 'test_helper' 

describe MyEngine::Customer do 

    let(:alex) { my_engine_customers(:alex) } # error here (error shown below) 

    it "alex is id 5" do 
    assert alex.id, 5 
    end 

end 

我得到這樣的:添加require 'minitest/autorun'test/test_helper.rb,然後 將上述試驗後錯誤:

NoMethodError: undefined method `my_engine_customers' for 
#<#<Class:0x007fb63e8f09e8>:0x007fb63e81b068> 

如何在使用minitest/spec時訪問燈具?

回答

7

當你使用spec DSL時,你會得到一個Minitest::Spec對象來運行你的測試。但Rails燈具和數據庫事務僅在ActiveSupport::TestCase或從它繼承的測試類如ActionController::TestCase中可用。因此,您需要的是使用ActionSupport::TestCase進行測試的規範DSL。

有兩個步驟,第一個ActiveSupport::TestCase需要支持spec DSL。您可以通過添加以下代碼,您test_helper.rb文件做到這一點:

class ActiveSupport::TestCase 
    # Add spec DSL 
    extend Minitest::Spec::DSL 
end 

(?你知道嗎ActiveSupport::TestCase.describe存在你可能想你,如果你打算做嵌套介紹加入該規範DSL之前去除方法)

其次,你需要告訴規範DSL使用ActiveSupport::TestCase。 DSL僅爲此目的添加了register_spec_type。因此,還有以下添加到您的test_helper.rb文件:

class ActiveSupport::TestCase 
    # Use AS::TestCase for the base class when describing a model 
    register_spec_type(self) do |desc| 
    desc < ActiveRecord::Base if desc.is_a?(Class) 
    end 
end 

這將着眼於這一主題的描述,如果是它將使用的ActiveSupport::TestCase代替Minitest::Spec運行測試ActiveRecord模型。

正如您所預料的那樣,當您嘗試使用規範DSL進行控制器和其他類型的測試時,還會遇到很多其他問題。 IMO最簡單的方法是在test_helper.rb文件中添加對minitest-railsrequire "minitest/rails"的依賴關係。 minitest-rails可以完成所有這些配置和更多操作,並使流程更加順暢。 (同樣,IMO。)

欲瞭解更多信息,請參閱我的blaurgh文章Adding Minitest Spec in Rails 4。 < /無恥自我推銷>