我的解决方案涉及几个要实现的项目,但最终它看起来会更加优雅:
@CatchException
Scenario: Faulty operation throws exception
Given Some Context
When Some faulty operation invoked
Then Exception thrown with type 'ValidationException' and message 'Validation failed'
要完成这项工作,请遵循以下 3 个步骤:
第1步
标记您希望在某些标记中出现异常的场景,例如@CatchException
:
@CatchException
Scenario: ...
第2步
定义AfterStep
要更改ScenarioContext.TestStatus
为的处理程序OK
。您可能只想在 for When步骤中忽略错误,因此您仍然可以在Then verifying an exception 中使测试失败。必须通过反射来做到这一点,因为TestStatus
属性是内部的:
[AfterStep("CatchException")]
public void CatchException()
{
if (ScenarioContext.Current.StepContext.StepInfo.StepDefinitionType == StepDefinitionType.When)
{
PropertyInfo testStatusProperty = typeof(ScenarioContext).GetProperty("TestStatus", BindingFlags.NonPublic | BindingFlags.Instance);
testStatusProperty.SetValue(ScenarioContext.Current, TestStatus.OK);
}
}
第 3 步
验证TestError
与验证ScenarioContext
.
[Then(@"Exception thrown with type '(.*)' and message '(.*)'")]
public void ThenExceptionThrown(string type, string message)
{
Assert.AreEqual(type, ScenarioContext.Current.TestError.GetType().Name);
Assert.AreEqual(message, ScenarioContext.Current.TestError.Message);
}