Как написать спецификацию для методов класса, которые вызываются при загрузке класса? - PullRequest
4 голосов
/ 18 января 2012
class A
  include Logging
  log_to 'whatever'
end

Я хочу проверить, вызывается ли метод log_to с правильным параметром.Но, как вы уже догадались, метод log_to происходит из модуля Logging и вызывается при загрузке класса.Как мне написать спецификацию или пользовательское сопоставление, чтобы проверить, вызывается ли log_to 'whatever'?

Даже если я высмеиваю метод log_to для class A, в спецификации нет способа увидетьон будет вызываться так же, как и во время загрузки класса.Я попытался удалить константу и загрузить ее снова, которая, кажется, не работает.Мысли?

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Это, вероятно, должно быть в отдельном файле спецификации из файла спецификации, который проверяет большую часть функциональности класса 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 голос
/ 18 января 2012

Вы должны проверить желаемый результат, а не детали реализации. Я бы протестировал модуль логирования изолированно так:

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

И я не уверен, что протестировал бы реальный класс, который вообще использует этот модуль, поскольку он очень прост и содержит опасную логику. Случайные ошибки, такие как синтаксические ошибки, будут обнаружены интеграционным тестом.

...