2014-09-25 3 views
0

Я разрабатываю некоторые тестовые примеры в Ruby с помощью rspec.Mocking popen3 block form ruby ​​

Я пытаюсь высмеять функцию popen3.

Однако, в то же время сохраняя форму блокировки, я не в состоянии захватить ожидаемую выходную информацию:

Class MyClass 
    def execute_command 
    Open3.popen3(command) do |stdin, stdout, stderr, wait_thr| 
     output['wait_thr'] = wait_thr.value 
     while line = stderr.gets 
     output['stderr'] += line 
     end 
    end 
    return output 
    end 
end 

издеваться из функции, я делаю следующее:

it 'should do something' 
    response = [] 
    response << 'stdin' 
    response << 'stdout' 
    response << 'test' 
    response << 'exit 0' 

    # expect 
    allow(Open3).to receive(:popen3).with(command).and_yield(response) 

    # when 
    output = myClassInstance.execute_script 

    #then 
    expect(output['wait_thr'].to_s).to include('exit 0') 

Mocking функция не вводит код «do», и я остаюсь с пустой структурой данных.

Мне было интересно, как я мог правильно это сделать?

Спасибо!

+0

Не могли бы вы предоставить полную спецификацию? – wicz

+0

@wicz Я обновил сообщение – Parth

+1

И эта спецификация не возвращает никаких ошибок? Это немного запутанно. Вы издеваетесь над «ответом» как массивом, но «ожидаете», если это хэш. И сам код, вы определяете 'output' внутри блока и возвращаетесь в конце метода. Он должен возвращаться и ошибочно, потому что переменная не определена из блока. Или, может быть, теперь вы используете общий код. Это затрудняет помощь. – wicz

ответ

1

Думаю, вам нужно было поставить «ответ» вместо «ответа».

allow(Open3).to receive(:popen3).with(command).and_yield(*response) 

Это будет отправить 4 строки арг в and_yield («арность 4»), а не один аргумент, который является массивом.

Смежные вопросы