如何检查黄瓜没有变化?

时间:2011-05-31 08:41:30

标签: cucumber bdd specflow gherkin

我试图用黄瓜/小黄瓜(实际上是specflow)测试的业务场景是,给定Web表单上的一组输入,我发出请求,并且需要确保(在某些条件下),返回结果,特定字段没有改变(在其他条件下,它确实)。 E.g。

鉴于我在数据输入屏幕上 当我选择“不要更新frobnicator” 我提交表格 并显示结果 然后frobnicator没有更新

我如何编写“frobnicator未更新”的步骤?

一个选择是在“我提交表单”之前运行一个步骤,该表单读取类似“我记得frobnicator的价值”的内容,但这有点垃圾 - 这是一个实施细节的可怕泄漏。它分散了测试的注意力,而不是企业如何描述这一点。事实上,每当有人看到它时,我都必须解释这样一条线。

有没有人对如何更好地实现这一点有任何想法,理想情况下是写的?

2 个答案:

答案 0 :(得分:1)

我不同意之前的回答。 您感觉感觉的小黄蜂文本可能是正确的。 我将修改它一点以使其成为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,以及给你什么选项..但是为了表明它是可能的,我假设你已经解耦了你的数据从您的UI访问图层并能够模拟它 - 因此监控更新。

我使用的模拟语法来自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);
}

这里要注意的重要一点是,给定的步骤设置了我们正在测试的对象所需要的所有东西......我们不需要一个单独的笨重的步骤来说“我有一个frobnicator,我“要记住” - 这对利益相关者来说是不利的,而且对你的代码灵活性不利。

[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);
}

根据您的具体情况调整安排,行动,断言的原则。

答案 1 :(得分:0)

考虑如何手动测试它:

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"