Как правильно отформатировать автотест и RSpec при сравнении длинных текстов (с \ t и \ n)? - PullRequest
1 голос
/ 02 октября 2009

У меня есть тест в RSpec, который сравнивается с длинными текстовыми строками. Когда тест не пройден, я получаю сообщение, подобное этому:

'jobs partial should render the correct format for jobs' FAILED
expected: "Job {\n\tName = \"name1-etc\"\n\tType = Backup\n\tMessages = Daemon\n\tPool = Default
\n\tSchedule = \"schedule1\"\n\tStorage = storage1\n\tClient = \"name1\"\n\tFileset = \"fileset1
\"\n\tMax Wait Time = 5m\n\tWrite Bootstrap = \"/var/lib/bacula/name1-etc.bsr\"\n}\n\n",
     got: "Job {\n\tName = \"name1-etc\"\n\tType = Backup\n\tMessages = Daemon\n\tPool = Default
\n\tSchedule = \"schedule1\"\n\tStorage = storage1\n\tClient = \"name1\"\n\tFileset = \"fileset1
\"\n\tMax Wait Time = 5m\n\tWrite Bootstrap = \"/var/lib/bacula/name1-etc.bsr\"\n}\n\n" (using =
=)

Как мне сделать так, чтобы RSpec и автотест отвечали хорошо отформатированным различием (если это возможно, закрашивая различия между текстами? Как-то так

expected:
Job {
    Name = "name1-etc"
    Type = Backup
    Messages = Daemon
    Pool = Default
    Schedule = "schedule1"
    Storage = storage1
    Client = "name1"
    Fileset = "fileset1" <--diff
    Max Wait Time = 5m
    Write Bootstrap = "/var/lib/bacula/name1-etc.bsr"
}
got:
Job {
    Name = "name1-etc"
    Type = Backup
    Messages = Daemon
    Pool = Default
    Schedule = "schedule1"
    Storage = storage1
    Client = "name1"
    Fileset = "fileset2" <-- diff
    Max Wait Time = 5m
    Write Bootstrap = "/var/lib/bacula/name1-etc.bsr"
}

Ответы [ 2 ]

1 голос
/ 03 октября 2009

Лучшее решение, которое я нашел, было таким:

module CustomMatchers
    class HaveTheSameText
      def initialize(expected)
        @expected = expected
      end

      def matches?(actual)
        @actual = actual
        @actual == @expected
      end

      def failure_message
        `diff #{file_for @expected} #{file_for @actual}`
      end

      def negative_failure_message
        "don't apply"
      end

    private
      def   file_for text
        exp = Tempfile.new("bk", "/tmp").open
        exp.write(text)
        exp.close
        exp.path
      end
    end

    def have_the_same_text_of(expected)
      HaveTheSameText.new(expected)
    end
end

И в своей спецификации я использую

actual.should have_the_same_text_of expected
0 голосов
/ 02 октября 2009

Посмотрите, как это сделать Настраиваемые сопоставления ожиданий . Вы имеете полный контроль над сообщениями об ошибках и отрицательными сообщениями об ошибках.

...