как проверить ничего не изменилось в огурце? - PullRequest
0 голосов
/ 31 мая 2011

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

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

Как бы я написал шаг "Фробникатор не обновляется"?

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

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

Ответы [ 2 ]

1 голос
/ 28 января 2012

Я не согласен с предыдущим ответом. Корнишон текст, который вы чувствовали , как вы хотели написать, вероятно, прав. Я собираюсь изменить его просто немного , чтобы сделать так, чтобы шаг 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

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

Используемый мною синтаксис взят из 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);
}

Приспосабливайся к принципу «Организовывать, действовать, утверждать» в зависимости от ваших обстоятельств.

0 голосов
/ 31 мая 2011

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

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"
...