Лучшим вариантом было бы не встроить системный вызов в ваш контроллер. Вместо этого создайте отдельный объект, который знает, как убить ваши рабочие процессы и вызывать его с вашего контроллера. Для этого часто используется шаблон объекта службы . Это значительно облегчает заглушение / шпион / макет зависимости и гарантирует, что она останавливается на уровне приложения dry.
Это также позволяет вам тестировать объект изолированно. Тестирование старых ruby объектов действительно просто. Тестирование контроллеров не выполняется.
module WorkerHandler
def self.kill_all
system 'sh bin/resque/kill_resque_workers'
end
end
# in your test
expect(WorkerHandler).to receive(:kill_all)
Если ваш метод сервисного объекта выполняется на экземплярах класса, вы можете использовать stub_const , чтобы заглушить новый метод, чтобы он возвращал издевательства / шпионы.
Еще одно более новое решение - внедрение зависимостей через промежуточное ПО Rack. Вы просто пишете часть промежуточного программного обеспечения , которое внедряет ваш объект в env . env
- это переменная состояния, которая прошла весь путь промежуточного стека до вашего приложения. Вот как работает Warden, например. Вы можете передать env вместе со своим spe c, когда вы делаете http-вызовы на вашем контроллере или используете before { session.env('foo.bar', baz) }
.