Как написать rspec для логики и написать макет STDIN - PullRequest
2 голосов
/ 26 июня 2019

Я очень новый кодер и пытаюсь написать rspec для класса, который проверяет условную инструкцию / логику. Я начал писать код для sudo, но мне сказали сделать макет STDIN, что я не знаю как. Может кто-нибудь, пожалуйста, напишите rspec для класса или дайте мне несколько идей, как создать макет STDIN. Мне нужна помощь в написании rspec для условного оператора / логики, если кто-то может просто написать тест для одного из контекстов, тогда я могу сделать отдых, основываясь на этом.

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

1 Ответ

1 голос
/ 26 июня 2019

Вы можете использовать метод-заглушки .

В этом случае вы хотите заглушить STDIN.gets.chomp, поэтому вам нужно сделать что-то вроде этого:

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

Где stdin_input - строка, которую вы хотите, чтобы пользователь ввел для ваших тестов.

...