Особенности поведения — расчетное ожидаемое значение

Я использую тесты Behat для тестирования стороннего веб-сервиса для выставления счетов за подарочные карты. Каждый тест отправляет запрос на выставление счетов в веб-службу с суммой и возвращает оставшийся баланс. Есть ли в моей функции способ, чтобы ожидаемый ответ был переменной? Например:

  1. Звоните узнавайте баланс карты.
  2. Билл-карта на 5 долларов. Ожидаемый остаток должен быть равен первоначальному балансу минус 5.
  3. Билл-карта на 10 долларов. Ожидаемый баланс должен быть равен предыдущему балансу минус 10.

Я использовал метод «Примеры» для создания таблицы значений для прохождения теста и ожидаемых результатов, но каждый раз, когда я выполняю тест, мне приходится обновлять всю таблицу значений ответов. Я бы предпочел обновить только первое значение в таблице, а остальные рассчитать. Возможно ли это, и если да, то как?

Ниже приведен пример того, чего я надеюсь достичь:

| amount | result                            |
|    5   |  100                              |
|   10   |  previous result - current amount |

person user3154922    schedule 02.10.2014    source источник


Ответы (1)


Не очень понятно из вопроса, что вы хотите. Если это фиксированное значение, которое вы стремитесь использовать в своей функции, то единственный способ сделать это — установить начальный баланс из вашего приложения. Выполнение этого с помощью хука @beforeScenario, вероятно, будет самым простым решением (поскольку вы не можете делать это каждый раз в схеме сценария).

В качестве альтернативы, если вы не можете изменить баланс из пакета, единственный достойный вариант — сделать это следующим образом. Это может выглядеть не так конкретно, как утверждение фактического значения, но технически это одно и то же. Язык корнишонов (если его можно назвать языком) не допускает никаких операций, и наброски сценариев, вероятно, являются его наиболее динамичной частью.

Контекст

protected $balance;

/**
 * @Give /^I know the balance$/
 */
public function updateBalance() {

    // API call to get the balance…

    $this->balance = API::getBalance();
}

/**
 * @When /^I bill the card for (\d+) dollars$/
 */
public function billCard($amount) {

    // API call to bill the card…

    API::billCard($amount);
}

/**
 * @Then /^the balance should reduce by (\d+) dollars$/
 */
public function assertBalance($amount) {

    // API call to verify the balance was reduced correctly, don't forget to cast if necessary.

    if ($this->balance - $amount === ($currentBalance = (int) API::getBalance())) {
        $this->balance = $currentBalance;
    } else {
        throw new Exception();
    }
}

Функция

Scenario Outline: …
    Given I know the balance
    When I bill the card for <amount> dollars
    Then the balance should reduce by <amount> dollars

    Examples:
        | amount |
        |  5     |
        |  10    |
person Ian Bytchek    schedule 06.10.2014
comment
Да, именно этим я сейчас и занимаюсь. К сожалению, PM хочет ВИДЕТЬ результат в фиче. Она хочет увидеть столбец результатов, в котором указано первое значение, а последующие значения представляют собой указанный выше результат за вычетом значения в столбце количества. - person user3154922; 08.10.2014
comment
Значит ли это, что это то, что вам нужно, или это означает что-то другое? :) - person Ian Bytchek; 08.10.2014
comment
Это не то, что мне было нужно, это то, чем я сейчас пользуюсь. Я обновил свой пример, чтобы показать, что она хочет видеть. - person user3154922; 08.10.2014
comment
Я думал, что вы спрашивали об этом сначала, но не мог понять. Смотрите обновленный ответ. - person Ian Bytchek; 08.10.2014
comment
Это решение, я думаю, является удачным компромиссом. Я надеялся, что в синтаксисе Gherkin скрывается что-то, что позволит мне иметь динамические значения в этой функции. Спасибо за помощь. Мой PM может быть очень нуждающимся, особенно теперь, когда она может читать и писать тестовые случаи... - person user3154922; 08.10.2014
comment
Ха, приготовься к худшему, если она сможет читать и писать их сейчас! - person Ian Bytchek; 08.10.2014