Мое решение включает в себя несколько элементов для реализации, но в самом конце оно будет выглядеть намного элегантнее:
@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
. Возможно, вы захотите игнорировать ошибки только для при шагах, поэтому вы все равно можете не пройти тест в Затем , проверяющем исключение. Пришлось сделать это с помощью отражения, так как 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);
}