Представьте, что Cucumber - это тестирование всего вашего приложения извне, где RSpec - это модульное тестирование конкретных модулей. Вы начинаете с определения поведения, которое вы хотите, чтобы ваше приложение имело в Cucumber, затем опускаетесь в RSpec и описывает классы и модули, которые заставляют это поведение работать.
Мне потребовалось некоторое время, чтобы понять это, но я обнаружил, что Cucumber действительно хорош для описания в общих чертах того, какие функции вы хотите использовать в своем приложении, а RSpec действительно хорош для описания того, как он должен это делать.
Таким образом, вы бы сказали в своих рассказах о огурцах, какую именно функцию вы хотите, и написали супер простые шаги, чтобы обеспечить ввод и посмотреть на вывод. Затем вы переходите к RSpec и пишете спецификации о том, как он должен это делать.
Допустим, ваша функция - это возможность поиска имен пользователей на веб-сайте. Вы могли бы написать функцию огурца и первый (и только первый) сценарий, подобный этому:
Feature: Search users
In order to find people with similar interests as myself
As a user
I want to search for people
Scenario: Search for similar hobbies
Given there is a search page
And there is a list of hobbies
And one of the hobbies is "full contact ironing"
When I select "full contact ironing"
And press search
Then a list of users with the hobby "full contact ironing" are shown
Вы запускаете Cucumber, он сообщает вам шаги, которые вам не хватает, вы копируете их и создаете простые шаги для проверки этого материала, но пока не пишете код.
Закончив определения шагов, вы переходите в RSpec и начинаете писать спецификации о том, как вы хотите, чтобы это работало. (Огурец, конечно, должен подвести)
describe "SearchController" do
it "should respond to searches" do
sc = SearchController.new
sc.should respond_to(:search)
end
end
Вы запускаете RSpec и смотрите, как он выходит из строя, затем уходите и пишете свой код:
class SearchController
def search
end
end
Вот и все. Теперь запустите тест снова. Это должно пройти, поэтому начните становиться более конкретным и начните описывать, как вы на самом деле будете использовать функцию поиска. Я не хотел вдаваться в подробности, я просто хотел дать вам идею, чтобы вы описали, что вы хотите в Cucumber, а затем опишите, как это на самом деле должно работать в RSpec.
Конечно, вы можете делать все в Cucumber или в RSpec, но я действительно обнаружил, что Cucumber помогает мне очень просто сказать, что я хочу, где, если я пытаюсь сделать это в RSpec, я увязаю в деталях. Если я сначала использую Cucumber, чтобы описать базовую функцию, которую я хочу, и почему тогда я могу перейти в RSpec и сказать, как я хочу, чтобы эта функция действительно работала.
Иногда в ваших тестах будет дублирование, которое не очень СУХОЕ, но если вы считаете это проблемой уровня детализации, это может вас не беспокоить. Сначала я делал много копий усилий, пока не понял, что должен просто сказать, что я хочу в Cucumber, а потом сказать, что я хочу в RSpec.
Это всего лишь идея новичка о том, как использовать инструменты, но пока мне кажется, что это хорошо работает. Я, вероятно, привел вам ужасный пример, но я просто пытаюсь донести смысл общих деталей до конкретных деталей, которые я нашел полезными при использовании инструментов.