Как написать тест Rspe c для запуска файла из командной строки? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть проект Ruby с исполняемым файлом UNIX с именем parse, расположенным во вложенной папке bin в каталоге root моего проекта. На данный момент это просто:

#!/usr/bin/env ruby
# frozen_string_literal: true

puts 'hello world'

Файл может быть выполнен в командной строке, когда эта команда запускается из каталога проекта root: bin/parse

Работает нормально , но я также хочу написать для него проходящий тест Rspe c. У меня есть файл spe c:

RSpec.describe "end-to-end application behaviour" do
  subject { system('bin/parse') }

  it 'prints the expected messsage to stdout' do
    expect { subject }.to output(
      'hello world'
    ).to_stdout
  end
end

Когда я запускаю его, я получаю ошибку теста:

ожидаемый блок для вывода «hello world» на стандартный вывод, но вывод ничего

Это расположение моего файла spe c относительно моего проекта root: spec/integration/parse_spec.rb

Я попытался разместить операторы require и require_relative в этот файл spe c с путями к исполняемому файлу parse, на случай, если это поможет, но я просто продолжал получать:

LoadError: не могу загрузить такой файл

Кто-нибудь знает, как я могу написать тест в этом файле, который пройдет и подтвердит, что поведение parse исполняемого файла работает?

1 Ответ

1 голос
/ 03 августа 2020

Не используйте RSpe c Выходное сопоставление

RSpe c имеет встроенный выходной сопоставитель , который может тестировать оба где выход , а также его содержимое. Однако он проверяет, куда идет ваш вывод Ruby, а не то, использует ли какое-либо внешнее приложение стандартный ввод или стандартную ошибку. Вам придется сделать несколько разных предположений о своем коде.

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

RSpec.describe "parse utility output" do
  it "prints the right string on standard output" do
    expect(`echo hello world`).to start_with("hello world")
  end

  it "shows nothing on standard output when it prints to stderr" do
    expect(`echo foo >&2 > /dev/null`).to be_empty
  end
end

Просто замените операторы echo на правильный вызов parse для вашей системы, возможно, установив PATH непосредственно в вашей оболочке, используя такую ​​утилиту, как direnv или изменив ENV["PATH"] в вашем spe c или spec_helper.

Как показывает опыт, RSpe c на самом деле не предназначен для тестирования приложений командной строки. Если вы хотите это сделать, рассмотрите возможность использования Aruba framework для тестирования приложений командной строки. Лучше использовать RSpe c для проверки результатов методов или вывода команд, а не пытаться протестировать базовую c функциональность. Конечно, ваш пробег может отличаться.

...