2017-04-22 54 views
1

我需要測試傳入的參數類型是一個整數。這裏是我的測試規範:RSpec如何測試傳遞給方法的參數數據類型

require 'ball_spin' 

RSpec.describe BallSpin do 
    describe '#create_ball_spin' do 
    subject(:ball_spin) { BallSpin.new } 
    it 'should accept an integer argument' do 
     expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Integer)) 
     ball_spin.create_ball_spin(5) 
    end 
    end 
end 

我的代碼:

class BallSpin 
    def create_ball_spin n 
    "Created a ball spin #{n} times" if n.is_a? Integer 
    end 
end 

在此先感謝

UPDATE:

道歉使用舊RSpec的語法,下面我更新了我的代碼使用最新的:

it 'should accept an integer argument' do 
    expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Integer)) 
    ball_spin.create_ball_spin(5) 
end 

回答

1

您可以將塊添加到receive檢查方法PARAMS:

expect(ball_spin).to receive(:create_ball_spin) do |arg| 
    expect(arg.size).to be_a Integer 
end 

您可能會發現rspec-mocks文檔Arbitrary Handling section細節。

UPDATE:您也可以使用同樣的方法與should語法:

ball_spin.should_receive(:create_ball_spin) do |arg| 
    arg.should be_a Integer 
end 
+0

謝謝回答,我得到了一個錯誤NoMethodError你好:未定義的方法'收到」爲#

+1

@Kris MP,您使用的是什麼版本Rspec的呢? –

0

receive匹配的使用情況是符合規範的是一個方法被人稱爲。但值得注意的是,匹配器本身不會調用該方法,也不會測試該方法是否存在,或者可能參數的列表是否與給定模式匹配。

好像你的代碼不調用該方法在所有。應通過的簡單測試可能如下所示:

subject(:ball_spin) { BallSpin.new } 

it 'is called with an integer argument' do 
    ball_spin.should_receive(:create_ball_spin).with(an_instance_of(Integer)) 
    ball_spin.create_ball_spin(5) # method called 
end 

it 'is not called' do 
    ball_spin.should_not_receive(:create_ball_spin) 
    # method not called 
end 

請參閱部分Argument Matcher

順便說一句,你使用舊的RSpec的語法和可能要考慮更新您的測試套件的新expect語法。

+0

已經試過這個,但仍然沒有運氣 –

+0

@KrisMP我更新了我的答案。因爲我覺得你覺得匹配器的工作方式不符合設計要求。 – spickermann

+0

我已更新我的問題並調整爲RSpec新語法 –

1

我想原因是,5 Fixnum對象,而不是整數的一個實例:

2.2.1 :005 > 5.instance_of?(Fixnum) 
    => true 
2.2.1 :006 > 5.instance_of?(Integer) 
    => false 

UPDATE: 好吧,我想你的代碼和問題是整數,而不是Fixnum對象。這是正確的斷言:

RSpec.describe BallSpin do 
    describe '#create_ball_spin' do 
    subject(:ball_spin) { BallSpin.new } 
    it 'should accept an integer argument' do 
     expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Fixnum)) 
     ball_spin.create_ball_spin(5) 
    end 
    end 
end 
相關問題