Rspec для проверки номера - PullRequest
       1

Rspec для проверки номера

0 голосов
/ 24 сентября 2018

Я новичок в ruby, мне удалось вытащить код для ruby, но написание rspecs для них кажется проблематичным.Трудно понять способ написания rspecs даже после прочтения нескольких учебных пособий.Кто-то, пожалуйста, помогите мне написать для метода ввода, тогда я попытался бы реорганизовать его для остальных.

Файл RB:

module RubyOperations
  class Operations
    def input(num)
      RubyOperations.log('Enter a number:[Between 1 to 10]',:BOTH)
      num = Integer(gets.chomp)
      raise StandardError if num <= 0 || num > 10
      return num
    rescue StandardError, ArgumentError => e
      RubyOperations.log(e,:ERROR)
    end
  end
end

RSPEC:

describe 'RubyOperations' do
  describe 'Operations' do
    describe '.input' do
      context 'when number is provided' do
        it 'returns the number provided' do
          expect(RubyOperations.input(num)).to eq(Integer)
        end
      end
    end
  end
end

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Есть несколько проблем с кодом, которым вы поделились:

1) В классе Operations метод input получает аргумент, который нигде не используется из-за этой строки: num = Integer(gets.chomp),По сути, gets - это метод, который ожидает ввода пользователя, а присвоение num = ... переопределяет значение аргумента (num), которое передается в метод, поэтому бессмысленно передавать аргумент num в метод.

2) В вашем примере спецификации вы вызываете метод input для модуля RubyOperations, в то время как input живет в классе Operations в пространстве имен RubyOperations.Также метод input - это не метод класса, а метод экземпляра.Таким образом, правильный вызов метода будет выглядеть следующим образом: RubyOperations::Operations.new.input(5)

3) Чтобы запустить спецификацию для метода input, вам потребуется заблокировать ввод пользователя.В этом вам может помочь драгоценный камень RSpec-mocks - https://github.com/rspec/rspec-mocks. Он имеет allow метод заглушки: allow(object).to receive(:gets) { "5" }

Весь образец будет:

it 'returns the number provided' do
  # instantiate object that we will test
  subject = RubyOperations::Operations.new

  # we stub method 'gets' and whenever it is called we return string "5"
  allow(subject).to receive(:gets) { "5" } 

  # we call method input with argument 1, the argument 1 is pointless as described in point 1) and can be omitted
  expect(subject.input(1)).to eq(5)
end
0 голосов
/ 24 сентября 2018

Вы можете проверить класс вывода метода равным целому числу

require 'ruby_final_operations'
  describe 'RubyOperations' do
    describe 'Operations' do
      describe '.input' do
        context 'when number is provided' do
          it 'returns the number provided' do
            expect(RubyOperations.input(num).class).to eq(Integer)
            (or)
            expect(RubyOperations.input(num)).to be_a_kind_of(Integer) 
          end
         end
        end
       end
      end

И всякий раз, когда вы пишете rspec, помните

Если метод, для которого вы пишете rspec, имеет делос манипуляциями в вашей БД, затем проверьте, манипулирует БД или нет

Или, если вы пишете rspec для каких-либо методов, которые возвращают объект, тогда обрабатывается как

, если метод определен как

def square_of_a_number(num)
 num*num
end

Затем напишите rspec следующим образом:

it 'returns square of a number' do
  expect(square_of_a_number(2).to eq(4)   
end

Для любых методов, которые, как вам известно, вывод метода будет состоять в том, что затем жестко закодировать входной или пользовательский гем Faker для ввода метода ожидайтеожидаемый результат этого метода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...