如何为MiniTest包含模块

时间:2016-09-13 00:50:29

标签: ruby-on-rails minitest

我有一个Company的课程include GrowthRate

模型/ company.rb

class Company < ActiveRecord::Base
  include GrowthRate
end

growth_rate.rb中,我为Array添加了一些方法。

模型/公司/ growth_rate.rb

module Company::GrowthRate
  extend ActiveSupport::Concern
end

module Company::GrowthRate::Array
  def growth_rate
    # calculate growth rate
  end
end

class Array
  include Company::GrowthRate::Array
end

我想通过MiniTest测试Array的方法。

测试/模型/公司/ growth_rate_test.rb

require 'test_helper'

class CompanyTest < ActiveSupport::TestCase
  include Company::GrowthRate
  test 'test for adjusted_growth_rate' do
    array = [1, 0.9]
    Array.stub :growth_rate, 1 do
      # assert_equal
    end
  end
end

但测试最终会出现名称错误。

NameError: undefined method `growth_rate' for `Company::GrowthRate::Array'

如何包含MiniTest的方法?

测试/ test_helper.rb中

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/mock'
class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end

2 个答案:

答案 0 :(得分:0)

我认为你必须将models/company/growth_rate.rb移动到带有filename =&#39; growth_rate.rb&#39;

的app / model / concerns文件夹中

然后不要使用Company类来防止冲突类名称

module GrowthRate
  extend ActiveSupport::Concern

  # ...
end

现在您可以将其包含在公司模型中

然后在config / initializers文件夹中创建包含

的array.rb文件
class Array
  def growth_rate
    # calculate growth rate
  end
end

这个文件只会被rails加载一次,如果你想

那么将自定义方法添加到Array类是件好事

现在您可以从test / models / company / growth_rate_test.rb中删除include Company::GrowthRate

答案 1 :(得分:0)

您需要使用ActiveSupport包含的块。

对于你的例子,我想它找不到b / c你不需要任何文件的方法。

module PolymorphicTest
  extend ActiveSupport::Concern

  included do
    test 'some cool polymorphic test' do
      assert private_helper_method
    end


    private

    def private_helper_method
      # do stuff
    end
  end
end

Minitest也不会自动加载这些内容,因此您需要确保它们包含在test_helper中每个测试require中。

如果您需要我更多地解决这个问题,请询问。