如何在RSpec中存根STDIN.noecho(&:gets)

时间:2013-05-05 19:27:23

标签: ruby rspec

我有一个方法auth,我想要STDIN。

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

我已尝试STDIN.stub(:noecho).and_yield('some_pass'),并收到了NoMethodError: private method 'gets' called for "some_pass":String。我确定这里缺少一些东西,但我无法弄清楚它是什么。

2 个答案:

答案 0 :(得分:3)

noecho方法关闭echo然后产生流本身,但是你将它存根以产生一个字符串而不是io实例。因此,在{some_pass'上调用gets显然无法正常工作

你可以做到

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

或者

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

两者都应导致STDIN.noecho(&:gets)返回所需的字符串。

答案 1 :(得分: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