Много людей, которые говорят не, использует его, действительно говорят, не используют PHP 4. Это сводится к этому
, можно записать хороший код на любом языке
, и
можно записать плохой код на любом языке
, PHP может очень часто предоставлять себя становлению запутанными библиотеками запутанного кода и подавать 'заявку' действительно просто ряд сценариев (см. Moodle для хорошего примера этого...)
я думаю, что много из 'Не использует PHP для большого материала', прибывает из PHP, изрубленного от, он - исходная цель: язык шаблонной обработки. Который я могу понять, но существует много проектов, которые доказывают, что можно сделать это (Drupal, mediawiki, Facebook).
% x {…}
- это встроенный синтаксис Ruby, который фактически вызывает метод ядра Backtick (`) . Так что вы можете переопределить этот метод. Поскольку метод обратного апострофа возвращает стандартный вывод выполнения cmd в подоболочке, ваш переопределенный метод должен возвращать что-то похожее на это, например, строку.
module Kernel
def `(cmd)
"call #{cmd}"
end
end
puts %x(ls)
puts `ls`
# output
# call ls
# call ls
Как насчет того, чтобы записать его в текстовый файл или вывести на консоль?
def log(file)
puts "git log #{file}"
end
Не могли бы вы просто переопределить функцию с помощью метода, который возвращает истину при получении команды?
Я не знаю способа издеваться над модуль, боюсь. По крайней мере, с Mocha Kernel.expected
не помогает. Вы можете всегда заключить вызов в класс и поиздеваться над ним, примерно так:
require 'test/unit'
require 'mocha'
class SystemCaller
def self.call(cmd)
system cmd
end
end
class TestMockingSystem < Test::Unit::TestCase
def test_mocked_out_system_call
SystemCaller.expects(:call).with('dir')
SystemCaller.call "dir"
end
end
, что дает мне то, на что я надеюсь:
Started
.
Finished in 0.0 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
Используя Mocha, если вы захотите насмехаться над следующим классом:
class Test
def method_under_test
system "echo 'Hello World!"
`ls -l`
end
end
ваш тест будет выглядеть как:
def test_method_under_test
Test.any_instance.expects(:system).with("echo 'Hello World!'").returns('Hello World!').once
Test.any_instance.expects(:`).with("ls -l").once
end
Это работает, потому что каждый объект наследует методы типа system и `от объекта Kernel.
.