如何在 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
不过,可能还有更简洁的方法。
我需要给一个 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
不过,可能还有更简洁的方法。