Ложный системный вызов в рубине

Много людей, которые говорят не, использует его, действительно говорят, не используют PHP 4. Это сводится к этому

, можно записать хороший код на любом языке

, и

можно записать плохой код на любом языке

, PHP может очень часто предоставлять себя становлению запутанными библиотеками запутанного кода и подавать 'заявку' действительно просто ряд сценариев (см. Moodle для хорошего примера этого...)

я думаю, что много из 'Не использует PHP для большого материала', прибывает из PHP, изрубленного от, он - исходная цель: язык шаблонной обработки. Который я могу понять, но существует много проектов, которые доказывают, что можно сделать это (Drupal, mediawiki, Facebook).

18
задан dstnbrkr 27 October 2009 в 06:24
поделиться

5 ответов

% x {…} - это встроенный синтаксис Ruby, который фактически вызывает метод ядра Backtick (`) . Так что вы можете переопределить этот метод. Поскольку метод обратного апострофа возвращает стандартный вывод выполнения cmd в подоболочке, ваш переопределенный метод должен возвращать что-то похожее на это, например, строку.

module Kernel
    def `(cmd)
        "call #{cmd}"
    end
end

puts %x(ls)
puts `ls`
# output
# call ls
# call ls
17
ответ дан 30 November 2019 в 07:50
поделиться

Как насчет того, чтобы записать его в текстовый файл или вывести на консоль?

def log(file)
  puts "git log #{file}"
end
0
ответ дан 30 November 2019 в 07:50
поделиться

Не могли бы вы просто переопределить функцию с помощью метода, который возвращает истину при получении команды?

-1
ответ дан 30 November 2019 в 07:50
поделиться

Я не знаю способа издеваться над модуль, боюсь. По крайней мере, с 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
3
ответ дан 30 November 2019 в 07:50
поделиться

Используя 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.

.
13
ответ дан 30 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: