Как сообщить RSpec, что ожидание не выполнено для пользовательского типа ресурса Serverspec

Ниже я написал тип ресурса serverpec для проверки, имеют ли ключи правильные значения для некоторых файлов конфигурации YAML, которые у меня есть. Для каждого ключа в хэш-таблице я назначаю атрибут для экземпляра типа ресурса. Если ключ не существует, я хотел бы потерпеть неудачу с соответствующим сообщением.
Покопавшись в коде rspec, я обнаружил, что если я RSpec::Expectations модуль, который я могу вызвать fail_with() который должен сообщить, что тест не пройден. Однако я получаю SystemStackError с линии, которая вызывает fail_with() что говорит "уровень стека слишком глубоко". Я предполагаю, что я делаю это неправильно. Есть ли способ сделать тест неудачным с помощью сообщения, которое имеет смысл?

require 'yaml'

module Serverspec
  module Type

    class YAMLFile < Base
      include RSpec::Expectations

      def initialize(path)
        yaml = YAML.load_file(path)
        return unless yaml

        yaml.each { |key, value| self.send('#{key}=', value) }
      end

      def method_missing(m, *args, &block)
        # fail here with message
        self.fail_with('The key does not exist in the YAML file')
      end
    end

    def yaml_file(path)
      YAMLFile.new(path)
    end
  end
end

include Serverspec::Type

1 ответ

Решение состоит в том, чтобы использовать fail() метод вместо fail_with(), Я до сих пор не знаю, почему я не могу использовать fail_with() хоть. Вот рабочий код для дальнейшего использования:

require 'yaml'

module Serverspec
  module Type

    class YAMLFile < Base
      def initialize(path)
        yaml = YAML.load_file(path)
        return unless yaml

        yaml.each { |key, value| self.send('#{key}=', value) }
      end

      def method_missing(m, *args, &block)
        fail "The key '%s' does not exist in the YAML document" % m
      end
    end

    def yaml_file(path)
      YAMLFile.new(path)
    end
  end
end

include Serverspec::Type
Другие вопросы по тегам