Иногда вашим примерам RSpec нужен простой способ поделиться повторно используемым кодом. Лучший способ сделать это с помощью помощников. Помощники — это обычные методы Ruby, которыми вы делитесь в примерах. Чтобы проиллюстрировать преимущества использования помощников, давайте рассмотрим этот код —
class Dog attr_reader :good_dog, :has_been_walked def initialize(good_or_not) @good_dog = good_or_not @has_been_walked = false end def walk_dog @has_been_walked = true end end describe Dog do it 'should be able to create and walk a good dog' do dog = Dog.new(true) dog.walk_dog expect(dog.good_dog).to be true expect(dog.has_been_walked).to be true end it 'should be able to create and walk a bad dog' do dog = Dog.new(false) dog.walk_dog expect(dog.good_dog).to be false expect(dog.has_been_walked).to be true end end
Этот код понятен, но всегда полезно сокращать повторяющийся код, когда это возможно. Мы можем взять приведенный выше код и уменьшить часть этого повторения с помощью вспомогательного метода с именем create_and_walk_dog ().
class Dog attr_reader :good_dog, :has_been_walked def initialize(good_or_not) @good_dog = good_or_not @has_been_walked = false end def walk_dog @has_been_walked = true end end describe Dog do def create_and_walk_dog(good_or_bad) dog = Dog.new(good_or_bad) dog.walk_dog return dog end it 'should be able to create and walk a good dog' do dog = create_and_walk_dog(true) expect(dog.good_dog).to be true expect(dog.has_been_walked).to be true end it 'should be able to create and walk a bad dog' do dog = create_and_walk_dog(false) expect(dog.good_dog).to be false expect(dog.has_been_walked).to be true end end
Когда вы запустите приведенный выше код, вы увидите этот вывод —
.. Finished in 0.002 seconds (files took 0.11401 seconds to load) 2 examples, 0 failures
Как видите, мы смогли продвинуть логику создания и перемещения объекта собаки в помощника, что позволяет нашим примерам быть короче и чище.