如何编写在类加载时调用的类方法的规范?

时间:2012-01-18 13:43:27

标签: ruby rspec class-method

class A
  include Logging
  log_to 'whatever'
end

我想测试是否使用正确的参数调用方法log_to。但正如您可能已经猜到的那样,log_to方法来自Logging模块,并在类加载时被调用。如何编写规范或自定义匹配器以检查是否正在调用log_to 'whatever'

即使我在log_to上模拟class A方法,规范也无法确定它是否会在类加载期间被调用时被调用。我尝试删除常量并再次加载它似乎不起作用。想法?

2 个答案:

答案 0 :(得分:3)

这应该在spec文件的单独spec文件中,该文件测试A类的大部分功能:

describe 'A' do

  it 'should log when loaded' do
    class A ; end
    A.should_receive(:log_to).with('whatever')
    require 'a'
  end

end

但我会考虑将类的行为更改为更容易测试的内容。在构造上不寻常或具有棘手限制的测试也是代码味道。

答案 1 :(得分:1)

您应该测试所需的结果,而不是实施细节。我会像以下一样单独测试Logging模块:

describe Logging do
  TEST_IO = StringIO.new

  # some stub class for testing
  class Person
    include Logging
    log_to TEST_IO

    def name
      "Bob"
    end
  end

  after do
    TEST_IO.reopen
  end

  it "logs a method call to the given io" do
    person = Person.new
    TEST_IO.string.should eq("")
    person.name
    TEST_IO.string.should eq("name called\n")
  end

  # ...
end

我不确定我是否会测试使用该模块的真正类,因为它非常简单并且包含任何危险的逻辑。语法错误等意外错误将通过集成测试捕获。