如何使用Rspec 3.4

时间:2016-06-10 17:18:26

标签: ruby unit-testing rspec mocking rspec3

我是Rspec的新手,这是我第一次尝试在rails框架之外进行测试。我只是想了解当实现非常复杂时我怎么可能模拟我的应用程序的行为。

我希望能够模仿调用customize_gender输入选项的行为,并检查输入1时的结果是“男性”,输入2时结果是“女性”等。< / p>

我还希望能够检查@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

1 个答案:

答案 0 :(得分:1)

以下是你可以做到的,这里唯一嘲笑的是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