yahoo-eng-team team mailing list archive
-
yahoo-eng-team team
-
Mailing list archive
-
Message #70245
[Bug 1735588] Re: Mock autospec not used, or not used properly
Reviewed: https://review.openstack.org/524438
Committed: https://git.openstack.org/cgit/openstack/oslotest/commit/?id=0bde35899a10875891f0592961c01e9fbb854738
Submitter: Zuul
Branch: master
commit 0bde35899a10875891f0592961c01e9fbb854738
Author: Claudiu Belu <cbelu@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri Dec 1 03:24:14 2017 +0200
Adds mock autospec fixture
In typical unit tests, almost all of the dependencies are mocked or
patched (mock.patch), without any guarantee that the mocked methods
actually exist, or if their signatures are respected (see below). Because
of this, actual issues can easily be overlooked and missed, as the unit
tests are wrongfully passing.
The mock.Mock class accepts a spec as an argument, which only solves half
the problem: it only checks if an attribute exists, based on the given
spec. It does not guarantee that the given attribute is actually a method,
or if its signature is respected. Some unit tests may pass the autospec
argument, but mock doesn't support it at the moment.
mock.patch, mock.patch.object, mock.patch.multiple accept an autospec
argument, but because of a bug, it cannot be used properly.
Adds a fixture which replaces mock.Mock and mock.MagicMock with
subclass which accepts the autospec argument, and on call, it will
check the signature of the called method / function.
Adds a function which replaces mock.mock._patch with a subclass, which
treats the autospec argument properly (consumes the self / cls argument),
and sets autospec=True by default, unless otherwise specified.
WARNING: this function is not a fixture, and in order to benefit from it,
it will have to be called as EARLY as possible, before any test classes
are loaded, otherwise the original mock.mock._patch is used instead.
Needed-By: I3636833962c905faa0f144c7fdc4833037324d31
Needed-By: I4484e63c97bd1cdde3d88855eabe7545784f365e
Closes-Bug: #1735588
Change-Id: I0e4a55fbf4c1d175726ca22b664e240849a99856
** Changed in: oslotest
Status: In Progress => Fix Released
--
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/1735588
Title:
Mock autospec not used, or not used properly
Status in networking-hyperv:
New
Status in OpenStack Compute (nova):
In Progress
Status in os-win:
New
Status in oslotest:
Fix Released
Bug description:
Description
===========
In typical unit tests, almost all of the dependencies are mocked or
patched (mock.patch), without any guarantee that the mocked methods
actually exist, or if their signatures are respected (see below).
Because of this, actual issues can easily be overlooked and missed, as
the unit tests are wrongfully passing. [0]
The mock.Mock class accepts a spec as an argument, which only solves
half the problem: it only checks if an attribute exists, based on the
given spec. It does not guarantee that the given attribute is actually
a method, or if its signature is respected [1][2]. Some unit tests may
pass the autospec argument, but mock doesn't support it at the moment.
mock.patch, mock.patch.object, mock.patch.multiple accept an autospec
argument, but because of a bug [3][4], it cannot be used properly.
Steps to reproduce
==================
import mock
from mock.tests import testmock
m = mock.Mock(spec=testmock.Something)
# meth has the following signature:
# def meth(self, a, b, c, d=None):
m.meth()
Expected result
===============
TypeError should be raised.
Actual result
=============
A mock object is returned.
Proposal
========
Bug reports have been issues for the bugs mentioned above, see
[1][2][3][4], but until then, the mock library can be patched to
include the following changes:
- add autospec argument to mock.Mock and mock.MagicMock. Unit test should then pass the autospec argument whenever possible.
- fix the mock.patch autospec issue.
- enable mock.patch autospec by default, unless otherwise specified.
Links
=====
[0] https://review.openstack.org/#/c/461689/
[1] https://github.com/testing-cabal/mock/issues/393
[2] https://bugs.python.org/issue30587
[3] https://github.com/testing-cabal/mock/issues/396
[4] https://bugs.python.org/issue32092
To manage notifications about this bug go to:
https://bugs.launchpad.net/networking-hyperv/+bug/1735588/+subscriptions
References