2013-05-05 2 views
0

У меня есть метод auth, и я хотел бы заглушить STDIN.Как заглушить STDIN.noecho (&: получает) в RSpec

def auth 
    ... 
    @pass = STDIN.noecho(&:gets).chomp 
    ... 
end 

Я попытался STDIN.stub(:noecho).and_yield('some_pass'), и получил NoMethodError: private method 'gets' called for "some_pass":String. Я уверен, что здесь что-то не хватает, но я просто не мог понять, что это.

+0

Вы можете использовать отправить, чтобы обойти частные ограничения. Но вы можете пересмотреть тестирование STDIN. Он встроен и, вероятно, хорошо протестирован. – vgoff

+0

Прошу прощения за недоразумение. То, что я пытался сделать, это * stub * STDIN. – zuhao

ответ

3

Метод noecho выключает эхо, а затем дает сам поток, но вы гася его, чтобы получить строку вместо гипергликемии пример. В результате gets называется на «some_pass», который, очевидно, не работает

Вы могли бы сделать

STDIN.stub(:noecho).and_return('some_pass') 

Или

STDIN.stub(:gets).and_return('some_pass') 

Оба должны привести к STDIN.noecho(&:gets) возвращения нужной строки.

1

Вы действительно хотите получить 'some_pass'? Или вы просто хотите заглушить возвращаемое значение?

Я считаю, что вы просто хотите получить возвращаемое значение. Попробуйте использовать and_return или укороченный метод руки для гася, передавая хэш:

def auth 
    STDIN.noecho(&:gets).chomp 
end 

describe "Stubbing STDIN" do 

    it do 
    STDIN.stub(noecho: "some_pass") 

    expect(auth).to eq "some_pass" 
    end 

end