[英]How to test initializer number of arguments in Ruby
我需要對Ruby練習進行自動分級,並使用Rspec進行測試
該類是純紅寶石,我只需要驗證屬性(存在性和可訪問性)以及初始化程序中接收到的參數數量
# lib/card.rb
class Card
attr_reader :number, :suit
def initialize(number, suit)
@number = number
@suit = suit
end
end
# spec/card_spec.rb
require "spec_helper"
require_relative "../lib/card"
describe Card do
let(:subject) do
Card.new(1, "D")
end
it { expect(Card).to respond_to(:new).with(4).arguments }
end
➜ rspec spec/card_spec.rb
.
Finished in 0.00431 seconds (files took 0.12135 seconds to load)
1 example, 0 failure
盡管初始化器收到2個參數,並且我在測試中指定了4個參數,但測試仍通過
new
方法的Arity為-1
,這意味着可變數量的參數,因此規范可以通過。
請參閱: https : //ruby-doc.org/core-2.6.3/Method.html#method-i-arity
問題是您正在測試錯誤的方法。
問題是Card.new
是在Card.initialize
定義的。
所以:
it { expect(Card).to respond_to(:new).with(2).arguments }
實際上正在嘗試測試:
class Card
def self.new(number, suit)
...
end
end
您可以簡單地嘗試使用不正確的參數初始化Card
並檢查是否引發了ArgumentError
:
class Card
attr_reader :number, :suit
def initialize(number, suit)
@number = number
@suit = suit
end
end
describe Card do
context 'when initialized with incorrect number of arguments' do
[[], [1], [1, 2, 3], [1, 2, 3, 4]].each do |args|
it { expect { Card.new(*args) }.to raise_error(ArgumentError) }
end
end
context 'when initialized with correct arguments' do
it { expect(Card.new(1, 'D')).to be_a(Card) }
end
end
它輸出:
Card
when initialized with incorrect number of arguments
should raise ArgumentError
should raise ArgumentError
should raise ArgumentError
should raise ArgumentError
when initialized with correct arguments
should be a kind of Card
Finished in 0.01455 seconds (files took 0.64291 seconds to load)
5 examples, 0 failures
不過,可能會有更清潔的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.