【问题标题】:Meta Programming and Unit Testing in rubyRuby 中的元编程和单元测试
【发布时间】:2015-05-12 22:16:55
【问题描述】:

我正在使用 rspec 进行测试,虽然我不是在寻找完整的答案,但更多的是一种伪代码方法让我继续前进 - 我不确定如何为以下课程编写测试。

module AisisWriter
  class ClassFactory
    class << self
      undef_method :new
      attr_accessor :registered_objects

      def register(class_name, klass, params = nil)
        if !params.is_a(Array)
          raise ArgumentError, "params must be an array"
        end

        registered_object[class_name] = {:class_name => klass, :params => !params.nil? ? params.flatten : nil}
      end

      def create(class_name, params = nil)
        if !params.is_a(Array)
          raise ArgumentError, "params must be an array"
        end

        klass = registered_object[class_name]

        if !params.nil
          klass[:class_name].new(params.flatten)
        else
          flass[:class_name].new(*klass[:params])
        end
      end

    end
  end
end

我在 Rails 中编写这个类,以便我注册常用的类并能够快速创建它们。这个概念来自my question on reflection in ruby

我不确定如何测试有两件事。一个我必须确保您注册的课程确实已注册。如果您尝试创建其实际创建的类的实例,则有两个。

我可以编写一个get_registered_objects 函数来帮助处理第一个函数并将其与现有对象进行比较或遍历它以查找特定属性。

但是第二部分,你如何测试一个类被实例化了?

【问题讨论】:

    标签: ruby-on-rails ruby rspec metaprogramming


    【解决方案1】:

    为了单独测试.register,您需要一个getter 或.registered? 方法,它允许您访问单例类的内部。

    你也可以通过注册然后创建一个类来测试.register

    describe AisisWriter::ClassFactory do
      describe '.create' do
        let(:klass) { Hash.new }
        before { AisisWriter::ClassFactory.register('Foo', ClassStub, []) }
    
        it "registers the class" do
          instance = AisisWriter::ClassFactory.create('Foo', [])
          expect(instance).to be_a  
        end
      end
    end
    

    除此之外,您的代码充满了问题 - 您可能想了解类变量的工作原理 - 以及 attr_accessor 在放置在类 eval 中时的作用。

    您还可以使用以下方法减少寄存器的数量和复杂性:

    def register(klass, params = nil)
      class_name = klass.name
    end
    

    Ruby 在询问方法is_a?nil? 的末尾使用?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多