kgb 7.0 has been released with a handful of new features:
- Python 3.10 support
- Support for pytest, and other non-unittest-based test frameworks
- Snake-case and standalone assertion methods
- Workarounds for spying on methods with poorly-implemented decorators
It also drops official support for Python 2.6 and 3.4-3.5 (though these should still work for now, if you need them).
pytest
kgb now provides a spy_agency
fixture for pytest unit tests. This will set up a SpyAgency
for you, letting you spy on functions and assert calls. For example:
def test_doomsday_device(spy_agency):
device = DoomsdayDevice()
spy_agency.spy_on(device.destroy_reality, call_original=False)
device.trigger_the_event()
spy_agency.assert_spy_called(device.destroy_reality)
The SpyAgency
will be managed for the lifetime of the test, removing spies upon completion.
Snake-case and standalone assertion methods
We’ve provided snake_case versions of all the assertion methods, making for more natural tests. For instance, you can use assert_spy_called_with()
instead of assertSpyCalledWith()
. The old camelCase versions will continue to exist, though.
You can also call assertion methods without needing to mix in a SpyAgency
into your test. Just import from kgb.asserts
. This is useful if you have a need to spy on methods and assert them within non-unit test code, or without access to a SpyAgency
. For example:
from kgb.asserts import assert_spy_called_with
def check_connection_state(api_connection):
assert_spy_called_with(api_connection.make_request,
url='https://middleman.zyx',
method='POST')
Workarounds for bad decorators
Before, if you were trying to spy on a method (particularly unbound methods) wrapped in a decorator, and that decorator didn’t preserve the function’s original name, you’d hit an error looking up the method.
You can now work around this by passing the original function name when setting up a spy. For example:
def bad_decorator(func):
def _wrap(*args, **kwargs):
return func(*args, **kwargs)
return _wrap
class BadClass:
@bad_decorator
def good_func(self):
return 42
def test_good_func(spy_agency):
spy_agency.spy_on(BadClass.good_func,
owner=BadClass,
func_name='good_func')
kgb will try to detect when you need this and emit a warning during the test.
Get started with kgb 7.0
See the release notes for the full list of changes.
You can install kgb today through pip
:
$ pip install -U kgb
Visit our kgb documentation to see how to use kgb in your projects.
Read More