Невозможно вызвать метод модуля mixin в спецификации - PullRequest
1 голос
/ 12 апреля 2011

У меня есть следующий модуль:

# lib/translator/sms_command.rb
module Translator
  module SmsCommand
    def self.included(klass)
      puts "SmsCommand initialized in #{klass}"
    end
    def alias_command(name)

    end
  end
end

И следующая спецификация:

# spec/translator/sms_command_spec.rb
require 'spec_helper'

class ExampleCommand
  include Translator::SmsCommand
  alias_command :x
end

module Translator
  describe SmsCommand do
    describe "#alias_command" do
      it "registers the class with the command registry" do
        Translator::SmsCommand.command_registry.should include_key :x
      end

    end
  end
end

Да #alias_command ничего не делает на этом этапе, но это потому, что я в центреразвивая это.Тем не менее, когда я запускаю свою спецификацию, я вижу ...

SmsCommand initialized in ExampleCommand

, поэтому модуль, безусловно, смешивается, однако спецификации в строке alias_command :x в ExampleCommand как будто *Метод 1012 * никогда не становится доступным.

/spec/translator/sms_command_spec.rb:5:in `<class:ExampleCommand>': undefined method `alias_command' for ExampleCommand:Class (NoMethodError)

Я мог бы решить эту проблему путем наследования, хотя я бы предпочел модуль mixin.Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Вы хотите определить метод класса alias_command, не так ли? В этом случае вам нужно extend класс с модулем, простое включение превратит включенный метод в метод экземпляра!

Вы можете сделать это общепринятым способом следующим образом:

module Translator
  module SmsCommand
    def self.included(klass)
      puts "SmsCommand initialized in #{klass}"
      klass.extend ClassMethods
    end
    module ClassMethods
      def alias_command(name)
      end
    end
  end
end

Таким образом, когда вы включаете модуль, он автоматически расширяет целевой класс методами класса!

1 голос
/ 12 апреля 2011

Это потому, что это не включение, а расширение для доступа к alias_command в вашем методе Class

class ExampleCommand
  extend Translator::SmsCommand
  alias_command :x
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...