2016-12-20 2 views
1

Я пытаюсь написать тест для оператора case, используя minitest. Должен ли я писать отдельные тесты для каждого «когда»? Я включил свой код ниже. Сейчас он просто выводит заявления, но в конечном итоге он перенаправляет пользователей на разные методы. Благодаря!Написание теста для case case в Ruby

require 'pry' 
require_relative 'messages' 

class Game 
    attr_reader :user_answer 

    def initialize(user_answer = gets.chomp.downcase) 
    @user_answer = user_answer 
    end 

    def input 
    case user_answer 
    when "i" 
     puts "information" 
    when "q" 
     puts "quitter" 
    when "p" 
     puts "player play" 
    end 
    end 
end 
+0

Да, чтобы проверить каждый путь через этот код, вам нужно будет написать тест для каждого 'когда '. – slim

+2

Это действительно надуманный пример. Большую часть времени вам понадобится сделать несколько упражнений, когда выполняется серия событий. Иногда это становится настолько сложным, что вы хотите указать ввод и ожидаемый результат в серии файлов дел, хранящихся в JSON или YAML, для простоты. Убедитесь, что вы выполняете не только все возможные пути, но и репрезентативную выборку недействительных путей, например, пустые строки, значения «nil» или недопустимый ввод типа '$'. – tadman

ответ

4

This answer поможет вам. Тем не менее я отправлю один из способов применить его к вашей ситуации. Как было предложено @phortx при инициализации игры, переопределите пользовательский ввод по умолчанию с соответствующей строкой. Затем с помощью assert_output мы можем сделать что-то вроде:

#test_game.rb 
require './game.rb'   #name and path of your game script 
require 'minitest/autorun' #needed to run tests 

class GameTest < MiniTest::Test 

    def setup 
    @game_i = Game.new("i") #overrides default user-input 
    @game_q = Game.new("q") 
    @game_p = Game.new("p") 
    end 

    def test_case_i 
    assert_output(/information\n/) {@game_i.input} 
    end 

    def test_case_q 
    assert_output(/quitter\n/) {@game_q.input} 
    end 

    def test_case_p 
    assert_output(/player play\n/) {@game_p.input} 
    end 
end 

Запуск тестов ...

$ ruby test_game.rb 
#Run options: --seed 55321 

## Running: 

#... 

#Finished in 0.002367s, 1267.6099 runs/s, 2535.2197 assertions/s. 

#3 runs, 6 assertions, 0 failures, 0 errors, 0 skips 
+1

'assert_output' - самый функциональный способ протестировать эту концепцию, поскольку мы не можем полагаться на возвращаемое значение (которое всегда будет равным нулю) – engineersmnky

2

Вы должны проверить каждую ветвь корпуса. Via RSpec это будет работать таким образом:

describe Game do 
    subject { Game } 

    describe '#input' do 
    expect_any_instance_of(Game).to receive(:puts).with('information') 
    Game.new('i').input 

    expect_any_instance_of(Game).to receive(:puts).with('quitter') 
    Game.new('q').input 

    expect_any_instance_of(Game).to receive(:puts).with('player play') 
    Game.new('p').input 
    end 
end 

Однако из-за того факта, что puts некрасиво, чтобы проверить, вы должны реорганизовать код что-то вроде этого:

require 'pry' 
require_relative 'messages' 

class Game 
    attr_reader :user_answer 

    def initialize(user_answer = gets.chomp.downcase) 
    @user_answer = user_answer 
    end 

    def input 
    case user_answer 
    when "i" 
    "information" 
    when "q" 
     "quitter" 
    when "p" 
     "player play" 
    end 
    end 

    def print_input 
    puts input 
    end 
end 

Затем вы можете проверить с RSpec через :

describe Game do 
    subject { Game } 

    describe '#print_input' do 
    expect_any_instance_of(Game).to receive(:puts).with('quitter') 
    Game.new('q').print_input 
    end 

    describe '#input' do 
    expect(Game.new('i').input).to eq('information') 
    expect(Game.new('q').input).to eq('quitter') 
    expect(Game.new('i').input).to eq('player play') 
    expect(Game.new('x').input).to eq(nil) 
    end 
end 
+0

'user_answer' ссылается на метод, созданный' attr_reader: user_answer'. Он возвращает '@ user_answer'. –

+0

Да, вы правы, я забыл об этом. – phortx

+3

Хотя вы на правильном пути здесь, все это не будет работать, потому что 'puts' возвращает' nil'. Исходный код не легко тестируется, но может быть адаптирован для более дружелюбного. – tadman