如何在 Ruby 中测试初始化​​参数的数量

How to test initializer number of arguments in Ruby

我需要给一个 Ruby 练习自动评分,用 Rspec

测试

class 是纯粹的 ruby,我只需要验证属性(存在性和可访问性)和初始化程序中接收到的参数数量

# 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 方法的元数为 -1,这意味着参数数量可变,因此可以通过规范。

参见:https://ruby-doc.org/core-2.6.3/Method.html#method-i-arity

问题是你测试错了thing/method。

问题是 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

不过,可能还有更简洁的方法。