在rspec中,将类名传递给共享示例的正确方法是什么?

在rspec中,将类名传递给共享示例的正确方法是什么?,rspec,Rspec,在测试模块的rspec测试套件中,是用于评估包含该模块的类的行为的测试。下面是一个粗略的例子 describe "MyMod" do module MyMod; end shared_examples_for "a class" do |klass| it "includes the module" do klass.included_modules.include? MyMod.should be_true end end describe

在测试模块的rspec测试套件中,是用于评估包含该模块的类的行为的测试。下面是一个粗略的例子

describe "MyMod" do
  module MyMod; end 

  shared_examples_for "a class" do |klass|
    it "includes the module" do
      klass.included_modules.include? MyMod.should be_true
    end 
  end 

  describe "when included in a class" do
    before(:each) { class C; include MyMod; end }
    it_behaves_like "a class", C
  end 

  describe "when extended in a class" do
    before(:each) { class C; extend MyMod; end }
    it_behaves_like "a class", C
  end
end 
我遇到的问题是,当执行
类的行为类似于
时,类
C
没有定义,从而产生错误:

`block (2 levels) in <top (required)>': uninitialized constant C (NameError)
`block(2级)in':未初始化常量C(NameError)

定义类并将其传递给共享示例的正确方法是什么?

您遇到的问题是,在执行
块之前,共享示例的参数在
之前进行计算。您需要传递共享示例符号
:C
,并让您的示例将其转换为常数,或者需要传递一个设置其他变量的块,如

是的,谢谢,我从阅读本书中猜到了这一点。我尝试了
let(:klass){Class.new.extend(MyMod)}
,它适用于
extend
,但对
include
给出了一个错误:“调用了私有方法`include'。我想我会用不同的方法!