簡體   English   中英

如何在Ruby中測試參數的初始值設定項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM