モジュールに定義したクラス変数を後から変更するには、モジュール内に定義したアクセサを使わないといけません。include, extendしたクラスに定義したアクセサを通じても、モジュールにある共通したクラス変数を変更することはできません。

※ テストコードはbundle exe guardではなく、ruby test/~.rbと別々に実行しないとエラーになります。これはguardが各テストクラスごとに環境をリセットしないためです。クラス変数の変更が引き継がれてしまいます。

module Hello
  @@cls_val = "cls val"

  def cls_val_module
    @@cls_val
  end

  def cls_val_module=(val)
    @@cls_val = val
  end
end

class Foo
# include Hello
  extend Hello

  def self.cls_val=(val)
    @@cls_val = val
  end

  def self.cls_val
    @@cls_val
  end
end
test "can't change cls val module" do
  FooExtend.cls_val = "after"
  assert_equal "after", FooExtend.cls_val
  assert_equal "cls val", FooExtend.cls_val_module
end

test "change cls val module" do
  FooExtend.cls_val_module = "after"
  assert_equal "after", FooExtend.cls_val_module
end