2009-10-28 2 views
3

У меня есть код Ruby, который использует обратные метки в нескольких местах и ​​вы хотите проверить его. Я использую FlexMock и хочу каким-то образом издеваться над этим методом. Я знаю, что метод Kernel, :`, но не может заставить его работать с FlexMock. Как бы вы это сделали? Вот пример метода я хочу тест:Ruby - FlexMock Backticks Method

def foo 
    result = `ls` 
    if result.to_a.length > 0 
    true 
    else 
    false 
    end 
end 

ответ

3

Таким образом, оказывается, что метод backticks специально отображает Kernel.`, что отлично, если вы посмотрите на источник FlexMock, чтобы увидеть, что они считают допустимыми именами методов. Регулярное выражение, которое они используют, по существу, проверяет буквенно-цифровое выражение? или ! в конце, поэтому backtick не соответствует этому регулярному выражению.

Изменение кода внутренне разрешает начальное исключение, которое бросается, но на самом деле не делает код работой по назначению. Я мог бы обезвредить его, как предложил pierr, но это было бы очень повторяющимся в моем тестовом коде, поэтому я пошел по альтернативному маршруту и ​​просто сделал метод оболочки в своем библиотечном коде, который только делает обратные выходы. Этот метод затем может быть изделен желательным образом, и поскольку я использую только обратные элементы в небольшом количестве мест, мне не нужно было менять код моего базового кода.

1

Я ничего не знаю о flexmock, но вы можете захотеть взглянуть на this.

+0

Хм, я мог бы использовать что-то похожее на это, но он делает много работы, flexmock разработан, чтобы обойти. Частично проблема заключается в том, что 'метод называется иначе, чем стандартные методы, поэтому внутреннее регулярное выражение flexmock не считает, что это реальный метод, но +1 для хорошей идеи. Благодаря! –

0

Вы должны позвонить

Kernel.` "cmd" 

вместо использования

`cmd` 

на вашем коде. Затем вы можете проверить, как это:

it "should call system ls" do 
    Kernel.should_receive(:`).with("ls") 
    Kernel.` "ls" 
end 

в этом примере используется чистое Rspec

+1

Да, в моем ответе говорится, что flexmock не позволяет обратным выводам быть в издевающихся именах методов, поэтому, хотя это может работать для rspec, это не работает для flexmock. Спасибо хоть! –