2013-05-05 38 views
0

我有一個方法auth,我想存根STDIN。如何在RSpec中存根STDIN.noecho(&:gets)

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

您可以使用send來繞過私人限制。但是你可能會重新考慮測試STDIN。它內置並可能經過很好的測試。 – vgoff 2013-05-05 19:36:04

+0

我很抱歉誤會。我想要做的是* stub * STDIN。 – zuhao 2013-05-05 19:43:13

回答

3

noecho方法關閉回聲,然後產生了流本身,但你磕碰它產生一個字符串,而不是IO的實例。結果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