我不同意前面的答案。你觉得你想写的小黄瓜文字可能是对的。我将对其进行一些修改以使其成为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);
}
根据您的情况调整安排、行动、断言的原则。