我试图用黄瓜/小黄瓜(实际上是specflow)测试的业务场景是,给定Web表单上的一组输入,我发出请求,并且需要确保(在某些条件下),返回结果,特定字段没有改变(在其他条件下,它确实)。 E.g。
鉴于我在数据输入屏幕上 当我选择“不要更新frobnicator” 我提交表格 并显示结果 然后frobnicator没有更新
我如何编写“frobnicator未更新”的步骤?
一个选择是在“我提交表单”之前运行一个步骤,该表单读取类似“我记得frobnicator的价值”的内容,但这有点垃圾 - 这是一个实施细节的可怕泄漏。它分散了测试的注意力,而不是企业如何描述这一点。事实上,每当有人看到它时,我都必须解释这样一条线。
有没有人对如何更好地实现这一点有任何想法,理想情况下是写的?
答案 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"