【问题标题】:RSpec and ActiveModelRSpec 和 ActiveModel
【发布时间】:2012-02-03 15:52:25
【问题描述】:

我有一个模块,它包含 activemodel,我想使用 rspec 对其进行测试。

这是我目前的设置:

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?

提前致谢

【问题讨论】:

  • 我通过将主题更改为 MyModule::Base.new 使其工作。在 active_model.rb before do @model = subject end 应该是 before do @model = MyModule::Base.new

标签: ruby-on-rails rspec activemodel


【解决方案1】:

你试图做的太多了。因为您要测试 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

【讨论】:

  • 是的,这可能是一个更干净的选择,但我真正想看看 ActiveModel 方法是否会与我的类集成而不会出现任何故障,这就是为什么 ActiveModel::Lint::Tests 对我。不过谢谢你的想法。我真的很感激。
  • 您可以看到 dm-rails 是如何完成这项工作的:like github.com/datamapper/dm-active_model/blob/master/spec/…
  • 这实际上是一个错误的答案。如果您正在创建一个行为类似于 ActiveModel 的模型,它应该符合 ActiveModel API。 ActiveModel::Lint::Tests 可以确保您的模型符合此类 API。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多