Тестирование в Rspec функциональности методов случайной погоды в зависимости от сгенерированного случайного числа - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь провести 2 теста для проверки функциональности метода в классе Weather. Метод random_weather должен изменить @status в зависимости от результата random_number. Однако я не могу найти способ заставить random_number быть определенным числом.

Тест RSpec:

require 'weather'

describe Weather do
  subject { Weather.new }

  it 'Can create an instance of Weather' do
    expect(subject).to be_instance_of Weather
  end

  it 'Can return sunny when randomly choosing weather' do
    subject.stub(:generate_random_number) {5}
    expect(subject.status).to eq "Sunny"
  end

  it 'Can return stormy when randomly choosing weather' do
    subject.stub(:generate_random_number) {9}
    expect(subject.status).to eq "Stormy"
  end
end

Класс погоды:

class Weather
  attr_reader :status, :random_number

  def initialize
    @random_number = generate_random_number
    puts @random_number
    if (1..8).include?(@random_number)
      @status = "Sunny"
    else
      @status = "Stormy"
    end
  end

  def generate_random_number
    rand(1..10)
  end
end

пример сбоя:

  1) Weather Can return stormy when randomly choosing weather
     Failure/Error: expect(subject.status).to eq "Stormy"

       expected: "Stormy"
            got: "Sunny"

       (compared using ==)
     # ./spec/weather_spec.rb:17:in `block (2 levels) in <top (required)>'

1 Ответ

2 голосов
/ 18 октября 2019

У вас есть 3 варианта:

  • Обтекание случайности в методе и заглушка этого метода
  • Обтекание или класс генератора, который вводится, и внедрение неслучайного генератора в спецификации
  • заглушка rand

Я предпочитаю второй вариант, но первого может быть достаточно.

Частный метод

class Weather
  attr_reader :status, :random_number

  def random_weather
    @random_number = generate_random_number
    # ...
  end

  def generate_random_number
    rand(1..10)
  end
end

#specs
  it 'Can return sunny when randomly choosing weather' do
    subject.stub(:generate_random_number) {5}
    expect(subject.status).to eq "Sunny"
  end

Генератор впрыска

class Weather
  attr_reader :status, :random_number
  def initialize(random_number_generator: RandomNumberGenerator)
    @random_number_generator = random_number_generator
  end

  def random_weather
    @random_number = random_number_generator.call
    # ...
  end
end

class RandomNumberGenerator
  def self.call
    rand(1..10)
  end
end

#specs
  subject { described_class.new(generator) }
  let(:generator) { ->{ 5 } }    
  it 'Can return sunny when randomly choosing weather' do
    expect(subject.status).to eq "Sunny"
  end

Заглушка rand в спецификации

  it 'Can return sunny when randomly choosing weather' do
    stub(:rand) {5}
    expect(subject.status).to eq "Sunny"
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...