как проверить в огурце ничего не изменилось?

Бизнес-сценарий, который я пытаюсь протестировать с помощью огурца / корнишона (на самом деле, specflow), заключается в том, что, учитывая набор входных данных в веб-форме, я делаю запрос и должен гарантировать, что (при определенных условиях), когда результат будет возвращается, то конкретное поле не изменилось (при других условиях - изменилось). Например.

Учитывая, что я нахожусь на экране ввода данных, когда я выбираю «не обновлять фробникатор» И я отправляю форму И отображается результат Тогда фробникатор не обновляется

Как мне написать шаг "фробникатор не обновляется"?

Один из вариантов - иметь шаг, который выполняется перед «Я отправляю форму», который читается что-то вроде «Я помню значение фробникатора», но это немного чушь - это ужасная утечка деталей реализации. Это отвлекает от теста, и компания не может это описать. Фактически, я должен объяснять такую ​​фразу каждый раз, когда кто-нибудь ее видит.

Есть ли у кого-нибудь идеи о том, как это можно реализовать немного лучше, в идеале, как написано?


person citizenmatt    schedule 31.05.2011    source источник


Ответы (2)


Я не согласен с предыдущим ответом. Текст из корнишона, который вы почувствовали так, как будто хотите написать, вероятно, правильный. Я собираюсь изменить его немного, чтобы сделать шаг When конкретным тестируемым действием.

Given I am on the data entry screen
And I have selected "do not update frobnicator"
When I submit the form
Then the frobnicator is not updated

Как точно вы утверждаете результат, будет зависеть от того, как ваша программа обновляет фробникатор и какие параметры он вам дает ... но чтобы показать, что это возможно, я предполагаю, что вы отделили свой уровень доступа к данным от свой пользовательский интерфейс и можете имитировать его - и, следовательно, отслеживать обновления.

Я использую макет синтаксиса из Moq.

...

private DataEntryScreen _testee;

[Given(@"I am on the data entry screen")] 
public void SetUpDataEntryScreen()
{
    var dataService = new Mock<IDataAccessLayer>();
    var frobby = new Mock<IFrobnicator>();

    dataService.Setup(x => x.SaveRecord(It.IsAny<IFrobnicator>())).Verifiable(); 
    ScenarioContext.Current.Set(dataService, "mockDataService");

    _testee = new DataEntryScreen(dataService.Object, frobby.Object);
}

Здесь важно отметить, что данный шаг устанавливает объект, который мы тестируем, со ВСЕМ, что ему нужно ... Нам не нужен был отдельный неуклюжий шаг, чтобы сказать: «И у меня есть фробникатор, который я собираюсь сделать». запоминать "- это плохо для заинтересованных лиц и плохо для гибкости вашего кода.

[Given(@"I have selected ""do not update frobnicator""")]
public void FrobnicatorUpdateIsSwitchedOff()
{
    _testee.Settings.FrobnicatorUpdate = false;
}

[When(@"I submit the form")]
public void Submit()
{
    _testee.Submit();
}

[Then(@"the frobnicator is not updated")]
public void CheckFrobnicatorUpdates()
{
    var dataService = ScenarioContext.Current.Get<Mock<IDataAccessLayer>>("mockDataService");

    dataService.Verify(x => x.SaveRecord(It.IsAny<IFrobnicator>()), Times.Never);
}

Адаптируйте принцип «Устраивайте, действуйте, утверждайте» в зависимости от ваших обстоятельств.

person perfectionist    schedule 27.01.2012

Подумайте, как бы вы проверили это вручную:

Given I am on the data entry screen
And the blah is set to "foo"
When I set the blah to "bar"
And I select "do not update frobnicator"
And I submit the form
Then the blah should be "foo"
person Andy Waite    schedule 31.05.2011