這try/catch語句的方式工作,但我看到了一些問題:
- 添加一個try /除了你的步驟意味着錯誤將被隱藏。
- 添加一個額外的裝飾是不雅觀的。我想我的裝飾是改性
@where
我的建議是
- 已在預期異常失敗的語句中的try/catch
- 之前,募集如果是沒有預料到的錯誤
- 在after_scenario中,如果預期錯誤未找到,則引發錯誤。
- 使用修改後的定/時/然後到處
代碼:
def given(regexp):
return _wrapped_step(behave.given, regexp) #pylint: disable=no-member
def then(regexp):
return _wrapped_step(behave.then, regexp) #pylint: disable=no-member
def when(regexp):
return _wrapped_step(behave.when, regexp) #pylint: disable=no-member
def _wrapped_step(step_function, regexp):
def wrapper(func):
"""
This corresponds to, for step_function=given
@given(regexp)
@accept_expected_exception
def a_given_step_function(context, ...
"""
return step_function(regexp)(_accept_expected_exception(func))
return wrapper
def _accept_expected_exception(func):
"""
If an error is expected, check if it matches the error.
Otherwise raise it again.
"""
def wrapper(context, *args, **kwargs):
try:
func(context, *args, **kwargs)
except Exception, e: #pylint: disable=W0703
expected_fail = context.expected_fail
# Reset expected fail, only try matching once.
context.expected_fail = None
if expected_fail:
expected_fail.assert_exception(e)
else:
raise
return wrapper
class ErrorExpected(object):
def __init__(self, message):
self.message = message
def get_message_from_exception(self, exception):
return str(exception)
def assert_exception(self, exception):
actual_msg = self.get_message_from_exception(exception)
assert self.message == actual_msg, self.failmessage(exception)
def failmessage(self, exception):
msg = "Not getting expected error: {0}\nInstead got{1}"
msg = msg.format(self.message, self.get_message_from_exception(exception))
return msg
@given('the next step shall fail with')
def expect_fail(context):
if context.expected_fail:
msg = 'Already expecting failure:\n {0}'.format(context.expected_fail.message)
context.expected_fail = None
util.show_gherkin_error(msg)
context.expected_fail = ErrorExpected(context.text)
導入我的修改給出/然後/時,而不是循規蹈矩,並添加到我的environment.py發起上下文。預期失敗的情況之前和之後檢查它:
def after_scenario(context, scenario):
if context.expected_fail:
msg = "Expected failure not found: %s" % (context.expected_fail.message)
util.show_gherkin_error(msg)
在我看來,確保代碼在某些情況下拋出某些異常是一個非常標準的事情來測試。對於向客戶端代碼展示它所期望的行爲也很好。當我測試的時候,我沒有測試失敗!無論如何,這是大多數測試框架的一個非常標準的功能。 –