没有minitest/spec,测试看起来像这样,并且my_engine_customers装置被加载了(一切都很好):
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 'minitest/autorun'添加到test/test_helper.rb之后,然后
转换以上测试:
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

我收到此错误:
NoMethodError: undefined method `my_engine_customers' for
#<#<Class:0x007fb63e8f09e8>:0x007fb63e81b068>

使用minitest/spec时如何访问灯具?

最佳答案

使用规范DSL时,您会得到一个Minitest::Spec对象来运行测试。但是,Rails固定装置和数据库事务仅在ActiveSupport::TestCase中可用,或者仅在ActionController::TestCase中测试从其继承的类。因此,您需要的是某种规范DSL使用ActionSupport::TestCase进行测试的方法。

这样做有两个步骤,首先ActiveSupport::TestCase需要支持规范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

这将看一下describe的主题,如果它是ActiveRecord模型,它将使用ActiveSupport::TestCase而不是Minitest::Spec来运行测试。

如您所料,尝试将DSL规范用于 Controller 和其他类型的测试时,还会涉及许多其他陷阱。 IMO最简单的方法是在require "minitest/rails"文件中添加对minitest-rails的依赖关系,然后添加对test_helper.rb的依赖关系。 minitest-rails可以完成所有所有这些配置,并使过程更加流畅。 (再次,IMO。)

有关更多信息,请参阅我的博客文章Adding Minitest Spec in Rails 4

关于ruby-on-rails-4 - Rails和minitest/spec中的NoMethodError <夹具名称>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27883596/

10-11 03:02