2015-04-20 54 views
2

對於默認的Rails,您可以添加所謂的ActiveModel::Lint::Tests以查看您的模型是否遵守ActiveModel的某些部分。如何在Rspec中使用ActiveModel :: Lint :: Tests

我想在我的Rspec測試中調用這些或其等價物。

  • 我不想測試確切的行爲:lint只測試某個特定接口存在的規格。我只想規定接口存在。我不是test too close implementation。僅僅測試包含模塊與測試接口是否存在並不相同。

有沒有一個技巧可以運行,並在rspec示例中包含Rails核心ActiveModel::Lint::Tests?是否有替代方案,專門爲Rspec構建,可以進行這種檢測?

一些背景

我建立不從Activerecord::Base繼承,而是作爲工廠或狀態機模型。在Rails中也被稱爲服務對象。這些應該像用戶的ActiveModels一樣。像

@services << CompositeService.new(name: 'foo', children: [{ name: 'bar' }]) 
render @services 

應該是可能的。那麼這樣的一個CompositeService應該具有activemodel命名,部分路徑,緩存id等等。

回答

0

我正在寫一個gem,它提供了ActiveModel兼容模型和使用RSpec 3.x.

爲了獲得棉絨測試,我添加了activemodel作爲開發依賴項。這也帶來ActiveSupportMinitest。我想我可以像過去那樣使用像this gist這樣的東西,但遇到issue試圖使測試使用Minitestassert

我結束了扔了一起(信貸要點的作者),並把它變成spec/support

require 'active_model/lint' 
require 'minitest' 

RSpec.shared_examples_for ActiveModel do 
    include ActiveModel::Lint::Tests 
    include Minitest::Assertions 

    alias_method :model, :subject 

    attr_accessor :assertions 

    before(:each) { self.assertions = 0 } 

    ActiveModel::Lint::Tests.public_instance_methods.map(&:to_s).grep(/^test/).each do |m| 
    it(m.sub 'test_', 'responds to ') { send m } 
    end 
end 

這似乎到目前爲止是工作,我得到的錯誤信息是這樣的:

Failure/Error: it(m.sub 'test_', 'responds to ') { send m } 
Minitest::Assertion: 
The model should respond to to_key 

這並不理想,但現在對我來說很好。皮棉測試非常簡單,只需從 (請參閱the source)開始實施共享示例,這非常簡單,但這種方式我只能依靠gem來保持測試的最新性。