如何根据 Rspec 3.4 的用户输入 stub/mock 多个选项
How to stub/mock multiple options depending on user input with Rspec 3.4
我是 Rspec 的新手,这是我第一次尝试在 rails 框架之外进行测试。我只是想了解当实现非常复杂时如何模拟我的应用程序的行为。
我希望能够模仿调用 customize_gender
输入选项并检查输入 1 时结果为 'Male'、输入 2 时结果为 [=28] 的行为=],等等
我还希望能够检查 @gender
的实例变量是否设置正确,这就是我首先添加 attr_reader :gender
的原因。我一直在尝试一些事情,但我想我不明白模拟通常是如何工作才能找到解决方案的。我看过类似的问题,但它们似乎不适用于我的情况。非常感谢任何见解!
主文件(person.rb)
class Person
attr_reader :gender
GENDER = { male: 'Male', female: 'Female', other: 'Other'}
def initialize
puts customize_gender
end
def customize_gender
display_hash_option GENDER, 'What is your gender? '
choice = gets.chomp.to_i
@gender =
case choice
when 1
GENDER[:male]
when 2
GENDER[:female]
when 3
print 'Enter your preferred gender: '
gets.chomp.downcase
else
puts 'Error: Person -> customize_gender()'
end
end
private
def display_hash_option(hash, saying = '')
print saying
hash.each_with_index { |(key, _value), index| print "#{index.next}) #{key} " }
end
end
Rspec 文件 (spec/person_spec.rb)
require_relative "../person"
describe Person do
let(:person) { Person.new }
allow(Person).to receive(:gets).and_return(1,2,3)
person.customize_gender
expect(person.gender).to eq 'Male'
# allow(person).to receive(:customize_gender).and_return('Male')
# expect(Person).to receive(:puts).with('What is your gender?')
# allow(Person).to receive(:gets) { 1 }
# expect(person.gender).to eq 'Male'
end
你可以这样做,这里唯一被嘲笑的是 gets
设置为“1”(记住在这种情况下它是一个字符串,因为 gets
输入总是一个字符串)
RSpec.describe Person do
subject { Person.new }
it 'returns male as gender when male is chosen' do
allow(subject).to receive(:gets).and_return('1')
subject.customize_gender
expect(subject.gender).to eq('Male')
end
end
对于 when 3
,您可以使用以下内容。
RSpec.describe Person do
subject { Person.new }
it 'returns other as gender when other has been entered' do
allow(subject).to receive(:gets).and_return('3', 'other')
subject.customize_gender
expect(subject.gender).to eq('other')
end
end
我是 Rspec 的新手,这是我第一次尝试在 rails 框架之外进行测试。我只是想了解当实现非常复杂时如何模拟我的应用程序的行为。
我希望能够模仿调用 customize_gender
输入选项并检查输入 1 时结果为 'Male'、输入 2 时结果为 [=28] 的行为=],等等
我还希望能够检查 @gender
的实例变量是否设置正确,这就是我首先添加 attr_reader :gender
的原因。我一直在尝试一些事情,但我想我不明白模拟通常是如何工作才能找到解决方案的。我看过类似的问题,但它们似乎不适用于我的情况。非常感谢任何见解!
主文件(person.rb)
class Person
attr_reader :gender
GENDER = { male: 'Male', female: 'Female', other: 'Other'}
def initialize
puts customize_gender
end
def customize_gender
display_hash_option GENDER, 'What is your gender? '
choice = gets.chomp.to_i
@gender =
case choice
when 1
GENDER[:male]
when 2
GENDER[:female]
when 3
print 'Enter your preferred gender: '
gets.chomp.downcase
else
puts 'Error: Person -> customize_gender()'
end
end
private
def display_hash_option(hash, saying = '')
print saying
hash.each_with_index { |(key, _value), index| print "#{index.next}) #{key} " }
end
end
Rspec 文件 (spec/person_spec.rb)
require_relative "../person"
describe Person do
let(:person) { Person.new }
allow(Person).to receive(:gets).and_return(1,2,3)
person.customize_gender
expect(person.gender).to eq 'Male'
# allow(person).to receive(:customize_gender).and_return('Male')
# expect(Person).to receive(:puts).with('What is your gender?')
# allow(Person).to receive(:gets) { 1 }
# expect(person.gender).to eq 'Male'
end
你可以这样做,这里唯一被嘲笑的是 gets
设置为“1”(记住在这种情况下它是一个字符串,因为 gets
输入总是一个字符串)
RSpec.describe Person do
subject { Person.new }
it 'returns male as gender when male is chosen' do
allow(subject).to receive(:gets).and_return('1')
subject.customize_gender
expect(subject.gender).to eq('Male')
end
end
对于 when 3
,您可以使用以下内容。
RSpec.describe Person do
subject { Person.new }
it 'returns other as gender when other has been entered' do
allow(subject).to receive(:gets).and_return('3', 'other')
subject.customize_gender
expect(subject.gender).to eq('other')
end
end