ruby RSpec:为什么包含的模块只提供方法,而不提供常量?

fumotvh3  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(130)

我有一个包含常量的模块,我想在测试套件的单元测试中使用这些常量。
我不明白的是,如果我包含模块,为什么常量不可用,但方法(如果我向模块添加任何方法)可用。
示例如下:

module Namespace
  module Constants
    K = 1
    def mymethod; end
  end
end

describe Namespace::Subject do
  include Namespace::Constants
  context "Context" do
    it "should execute" do
      mymethod # succeeds
      K        # fails
    end
  end
end

字符串
同样的原理也适用于控制台:

2.5.5 :008 > include Namespace::Constants
 => Object 
2.5.5 :010 > K
 => 1

6mw9ycah

6mw9ycah1#

在命名空间中定义的常量可以通过在命名空间中的常量前面加上前缀来调用。继承是在定义它的级别上。当你在一个新的模块或类中包含方法时,它们可以在定义它们的对象级别上调用。
K在Ruby控制台中工作的原因是你在默认或全局范围内包含了它们。例如,如果你这样做了,你会得到不同的结果。

class A
  include Namespace::Constants
end

K
NameError: uninitialized constant K
A::K
=>1

a = A.new

a.class::K
=>1

字符串
这里有一个规格,也可以解释它

require 'pry'

module Namespace
  module Constants
    def mymethod; end
    K = 1
  end
end

module Namespace
  module Subject
    include Namespace::Constants
  end
end

class A
  include Namespace::Constants
end

describe Namespace::Subject do
  describe 'Inherited Constants' do
    it 'is defined module level' do
      # Check if K is defined at the class level
      expect(Namespace::Subject.const_get(:K)).to eq(1)
      expect(Namespace::Subject::K).to eq(1)
    end
  end
end

describe A do
  describe 'instance methods' do
    it 'defines mymethod' do
      a = A.new
      expect(a).to respond_to(:mymethod)
    end
  end
  describe 'inherits' do
    it 'inherits class definitions' do
      expect(A::K).to eq(1)
    end
  end
end

describe 'Global Scope'  do
  it 'K is not defined' do
    include Namespace::Constants
    begin
      K
    rescue NameError => e
      puts e
    end
  end
end


希望这说明了继承在Ruby中的工作方式。你面临的问题与Rspec本身无关。

相关问题