поэтому нельзя применить к
ним матчер be. Ведь надпись может быть нарисована разной краской, разным
размером и т.д.
Т.к. все в руби объект, то это важно. Например, переменные a и b ниже равны,
но их идентификаторы разные, т.к. это разные объекты и они расположены в
разных областях памяти:
$ pry
> a = "XXX"
> b = "XXX"
> a == b
=> true
> a.__id__ == b.__id__
=> false
Давайте напишем еще один тест для нашей программы:
⁸¹https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers
Часть 4. Введение в ООП
400
it 'should calculate shipment with multiple items' do
expect(
Shipment.total_weight(soccer_ball_count: 3, tennis_ball_count: 2,\
golf_ball_count: 1)
).to eq(1420)
end
Ради удобства чтения выражение, которое мы хотим проверить было перенесено на отдельную строку. Результат выполнения всех тестов:
$ rspec -f d
Shipment
should work without options
should calculate shipment with only one item
should calculate shipment with multiple items
Finished in 0.00291 seconds (files took 0.19016 seconds to load)
3 examples, 0 failures
Все это хорошо, но выше был дан пример тестирования «статического» метода,
или метода класса (точнее модуля, что почти одно и то же), но не экземпляра.
Заметьте, что мы нигде не создавали никакого объекта, а вызывали класс напрямую. В случае наличия объекта для тестирования все становится намного
интереснее.
Можно долго рассказывать про rspec и существуют отдельные книги⁸² на эту
тему, но самый лучший совет, который могут дать авторы: при написании
программ старайтесь думать о том, как вы будете тестировать написанный
⁸²https://leanpub.com/everydayrailsrspec
Часть 4. Введение в ООП
401
вами код. Существует множество приёмов, но наша задача — познакомить вас
с синтаксисом и дать основы.
Задание 1:
Попробуйте заменить 1420 выше на 1421 и посмотрите что произойдет (тест не должен сработать).
Задание 2:
Код файла shipment.rb был изменен: если в метод “total_weight” не
переданы аргументы, генерируется ошибка (также говорят “выбрасывается исключение”):
module Shipment
module_function
def total_weight(options={})
raise "Can't calculate weight with empty options" if options.empty?
a = options[:soccer_ball_count] || 0
b = options[:tennis_ball_count] || 0
c = options[:golf_ball_count] || 0
(a * 410) + (b * 58) + (c * 45) + 29
end
end
Измените тест таким образом, чтобы тест проверял, что ошибка на самом деле
генерируется.
Часть 4. Введение в ООП
402
Заключение
Мы рассмотрели лишь некоторые возможности языка Руби, выполнили задания, заложили фундамент, который позволит уверенно двигаться дальше.
Для любого программиста очень важно понимание основ и возможностей
инструментов.
Знания, изложенные в этой книге, в течение нескольких лет собирались из
разных источников. Они дают неоспоримое преимущество перед другими
учащимися. Возможно, вам придется обращаться к этой книге снова — это
нормальный процесс, т.к. полученная информация усваивается постепенно,
оседает слоями, каждый раз дополняя общее понимание.
Если какие-то моменты оказались сложны для вашего понимания, мы рекомендуем вернуться к прочитанному материалу через 2-3 месяца. Авторы
желают успехов, не останавливаться на достигнутом, двигаться вперед к намеченной цели — удаленная работа, которая даёт свободу и финансовую
независимость.
Последние комментарии
6 часов 13 минут назад
6 часов 27 минут назад
7 часов 23 секунд назад
7 часов 32 минут назад
23 часов 2 минут назад
23 часов 12 минут назад