2012-02-03 23 views
2

我有一個模塊,它包含activemodel,我想用rspec來測試它。RSpec和ActiveModel

這是我的設置至今:

lib/ 
|__ my_module/ 
| |__ base.rb 
|__ my_module.rb 
spec/ 
|__ my_module_spec.rb 
|__ spec_helper.rb 
|__ support/ 
     |__ shared_examples/ 
      |__ active_model.rb 

內 'my_class.rb':

require "active_model" 
require "my_module/base" 

內 'base.rb':

module MyModule 
    class Base 
    extend ActiveModel::Naming 

    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    end 
end 

內「my_module_spec。 rb':

require 'spec_helper' 

describe MyModule do 
    describe MyModule::Base do 
    it_behaves_like "ActiveModel" 
    end 
end 

內 'spec_helper.rb':

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) 
$LOAD_PATH.unshift(File.dirname(__FILE__)) 
require 'rspec' 
require 'my_module' 

# Requires supporting files with custom matchers and macros, etc, 
# in ./support/ and its subdirectories. 
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} 

RSpec.configure do |config| 
end 

內 'active_model.rb':

# taken from http://pivotallabs.com/users/jdean/blog/articles/1706-form-backing-objects-for-fun-and-profit 

shared_examples_for "ActiveModel" do 
    require 'test/unit/assertions' 
    require 'active_model/lint' 
    include Test::Unit::Assertions 
    include ActiveModel::Lint::Tests 

    before do 
    @model = subject 
    end 

    ActiveModel::Lint::Tests.public_instance_methods.map { |method| method.to_s }.grep(/^test/).each do |method| 
    example(method.gsub('_', ' ')) { send method } 
    end 
end 

我以爲我的設置是正常的,但是當我試圖運行bundle exec rspec spec我得到這些錯誤:

Failures: 

    1) MyModule MyModule::Base behaves like ActiveModel test to key 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    2) MyModule MyModule::Base behaves like ActiveModel test to param 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    3) MyModule MyModule::Base behaves like ActiveModel test to partial path 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    4) MyModule MyModule::Base behaves like ActiveModel test valid? 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    5) MyModule MyModule::Base behaves like ActiveModel test persisted? 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    6) MyModule MyModule::Base behaves like ActiveModel test model naming 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    7) MyModule MyModule::Base behaves like ActiveModel test errors aref 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

    8) MyModule MyModule::Base behaves like ActiveModel test errors full messages 
    Failure/Error: example(method.gsub('_', ' ')) { send method } 

我在做什麼錯在這裏?我如何正確測試ActiveModel?

在此先感謝

+0

我通過改變主題MyModule :: Base.new使它工作。在active_model.rb之前做@model = subject end'應該在做@model = MyModule :: Base.new之前' – 2012-02-03 16:41:17

回答

0

你嘗試做太多。因爲你想測試ActiveModel庫。你只需要測試,如果你的對象包含這個模塊


require 'spec_helper' 

describe MyModule do 
    describe MyModule::Base do 
    it { MyModule::Base.should include(ActiveModel::Conversion) } 
    it { MyModule::Base.should include(ActiveModel::Validations) } 
    end 
end 
+0

是的,這可能是一個更清潔的選擇,但我真正想要的是看看ActiveModel方法是否會與我的課沒有任何失敗,這就是爲什麼ActiveModel :: Lint :: Tests對我來說真的很重要。謝謝你的想法。對此,我真的非常感激。 – 2012-02-03 16:48:33

+1

你可以看到dm-rails如何完成這個工作:像https://github.com/datamapper/dm-active_model/blob/master/spec/amo_validation_compliance_spec.rb – shingara 2012-02-07 13:31:06

+2

這實際上是一個錯誤的答案。如果您創建的行爲類似於ActiveModel,那麼它應該符合ActiveModel API。 ActiveModel :: Lint :: Tests可以確保你的模型符合這樣的API。 – 2013-05-30 15:14:55