Не пишите такие шаги и не вкладывайте шаги, вы просто попадете в беспорядок. Также данные предназначены для настройки состояния, а не для выполнения каких-либо действий.
Если у вас есть сложный шаг, подобный этому, у вас есть два лучших варианта, чем вложенные шаги
Наличие таких шагов, как «Когда я что-то щелкаю», является контрпродуктивным. Этот шаг все о том, КАК что-то сделано. Сценарии должны быть о том, что вы делаете, и почему это важно. Функции и сценарии предназначены не для программирования, а для описания поведения и должны быть очень простыми. Так что вы должны написать что-то вроде
Scenario: When I foo then the back button is disabled
Given ...
When I foo
Then the back button should be disabled
, например, для моего банка будет
Scenario: Smile login disables back button
Given I am logged into smile banking
When I try and use the back button
Then I should see the back button disabled warning
Наконец, каждое определение шага должно быть просто вызовом вспомогательного метода. например,
Given 'I am logged into smile banking' do
# NOTE: both params are also helper methods
login(site: smile_banking, user: create_user)
end
это позволяет вам перенести всю сложность из огурца в код. Код может справиться со сложностью, а огурец - нет.
Идея состоит в том, чтобы иметь возможность ссылаться на элементы сложного типа, подобные структуре, во время инициализации. Например,
struct s {
int a, b;
};
int main() {
struct s = { .b = 42, .a = -42 };
return 0;
}
Гибкость достигается за счет независимости от порядка при указании значений. Помните, что это было добавлено к стандарту C99 и может не поддерживаться компиляторами, которые не полностью поддерживают C99 (или не поддерживают более раннюю версию стандарта).
Если вы используете обычный список инициализаторов, значения для элементов назначаются по порядку, поэтому, если у вас есть эта структура :
typedef struct _foo {
int a;
int b;
} foo_t;
затем этот инициализатор явно назначает a
, а не b
:
foo_t value = { 7 };
без обозначенных инициализаторов, единственные элементы, которые могут быть пропущены, - это элементы, объявленные в конце
используя назначенные инициализаторы, вы можете опустить элементы, которые объявлены где угодно:
foo_t value = { .b = 8 };
, поэтому инициализатор для value.a
опущен, несмотря на то, что он является первым значением в структуре.