开发者

Unable to invoke mixin module method in spec

I have the following module:

# 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

And the following spec:

# 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

Yes #alias_command does nothing at this stage but that's because I'm in the midst of developing it. However, when I run my spec I am seeing...

SmsCommand initialized in ExampleCommand

so the module is certainly being mixed in, however the spec barfs on th开发者_如何学Goe alias_command :x line in the ExampleCommand as if the alias_command method is never becoming available.

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

I could solve this problem through inheritance though I'd prefer the mixin module. What am I missing?


It's because it's not an include but an extend to access alias_command in your Class method

class ExampleCommand
  extend Translator::SmsCommand
  alias_command :x
end


You want to define a class method called alias_command, don't you? In this case you need to extend the class with the module, a simple include will turn the included method into an instance method!

You can do it in a widely accepted way as follows:

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

This way when you include the module, it will automatically extend the target class with the class methods!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜