Robel
Robel

Reputation: 21

How to write rspec for logic and write mock STDIN

I am a very new coder and trying to write rspec for a class that test the conditional statement/logic. I started sudo coding for it but I was told to make mock STDIN which I don't know how to. Can someone please write the rspec for the class or give me a few idea how to create a mock STDIN. I need help writing rspec for the conditional statement/logic, if some can please just write the test for one of the context then I can do rest based on that.

require 'rails_helper'

module BAB::ACA

 RSpec.describe partfinder do

    describe '#find_part_id' do
      let(:face) { create(:face) }

      subject { described_class.find_part_id(face) }

      context 'When bab con already exists' do
        context 'when there are more than one part ids' do
          #create part ids 

        context 'when user input matches an existing id' do 
          #mock STDIN that matches an existing, subject should equal that id 
        end 

        context 'when user input does not match an existing id' do
          # mock STDIN that does match existing id, should return failure message
        end 
       end 

        context 'when there is only one bab part id' do
          # subject should equal the one that already exists
        end
       end 

        context 'when av con does not yet exist' do
          # mock STDIN and make sure subject equals what you mocked
        end
      end 
end

module BAB::ACA

    class partfinder

      def self.find_part_id(face)
        av_con = BAB::Child:Fail.find_by(
                  face: face
                  reg: BAB:Child.find_reg
                )
        if av_con
          look_id(face, av_con)
        end
        else
          puts "What is #{face.name} BAB part id? must be 6"
          STDIN.gets.chomp
        end
      end

      def self.look_id(face, av_con)
        if av_con.part_ids.length > 1
          ask_for_id(face, av_con)
        else
        av.con.part_ids.first
        end
      end

      def self.ask_for_id(face, av_con)
        puts "What is #{face.name} BAB part id? "
        bab_part_id = STDIN.gets.chomp

        unless av.con.part_ids.include?(bab_part_id)
          fail 'Entered id doesn't match'
        end
        bab_part_id
      end
    end
end

Upvotes: 2

Views: 272

Answers (1)

Glyoko
Glyoko

Reputation: 2090

You can use method stubs.

In this case you want to stub STDIN.gets.chomp, so you'd do something like this:

describe '#find_part_id' do
  before do
    allow(STDIN.gets).to receive(:chomp).and_return(stdin_input)
  end

  let(:stdin_input) { 'user input from stdin' }
  let(:face) { create(:face) }

  subject { described_class.find_part_id(face) }

  context 'When bab con already exists' do
    context 'when there are more than one part ids' do
      it 'some test' do
        # your test here
      end
    end

    # more contexts...

    context 'a context that needs a different stdin_input' do 
      let(:stdin_input) { 'some different user input from stdin' }

      it 'another test' do
        # your test here
      end
    end
  end
end

Where stdin_input is the string you want the user to enter for your tests.

Upvotes: 1

Related Questions