[TIP] Unit testing functions which call super
Harry Percival
harry.percival at gmail.com
Wed Aug 13 11:23:07 PDT 2014
Like this? https://gist.github.com/hjwp/44210e3e164bbb1fed18
On 13 August 2014 19:11, Harry Percival <harry.percival at gmail.com> wrote:
> If you know what the parent class is in advance, could you use mock.patch
> to stub out the parent method?
>
>
> On 13 August 2014 19:00, Marcin Tustin <Marcin.Tustin at dealertrack.com>
> wrote:
>
>> Hi All,
>>
>>
>>
>> I’ve come across a method which I needed to add a unit test for, which
>> calls super, e.g.
>>
>>
>>
>> def foofunc(self):
>>
>> x= do_some_stuff()
>>
>> if x:
>>
>> return x
>>
>> return super(WhatevClass, self).foofunc()
>>
>>
>>
>> Now, I don’t want to integration test the whole stack of super foofunc
>> methods, just unit test that one, down to the super call.
>>
>>
>>
>> I’ve accomplished this with, in my test (excuse the 8 leading spaces):
>>
>>
>>
>> def setUp(self):
>>
>> self.method_archive = {}
>>
>> for klass in WhatevClass.__mro__[1:]:
>>
>> # we use the class as its own sentinel
>>
>> meth_or_klass = klass.__dict__.get('foofunc', klass)
>>
>> if meth_or_klass != klass:
>>
>> self.method_archive[klass] = meth_or_klass
>>
>> del klass.foofunc
>>
>> # now patch an arbitrary member of the mro to supply a dummy
>> foofunc
>>
>> self.sentinel_klass = next(iter(self.method_archive))
>>
>> self.mock_sentinel = mock.MagicMock()
>>
>> self.sentinel_klass.foofunc = self.mock_sentinel
>>
>>
>>
>>
>>
>> And corresponding unpatching in tearDown.
>>
>>
>>
>> Is there any other approach which is standard, or objectively better?
>>
>>
>>
>> Thanks,
>>
>> Marcin
>>
>>
>>
>> *Marcin Tustin*
>> Senior Software Engineer
>> ------------------------------
>>
>>
>> 1111 Marcus Avenue
>> Lake Success, NY 11042
>> dealertrack.com <https://www.dealertrack.com/>
>>
>> p 516.300.7072
>>
>>
>> *dealertrack **technologies*™
>>
>> Confidentiality Notice: This e-mail and any attachments may contain
>> confidential, proprietary information of Dealertrack Technologies. It is
>> intended solely for the named recipient(s) listed above and should be
>> maintained in strictest confidence. If you are not the intended recipient,
>> you are hereby notified that any disclosure, copying, distribution, or use
>> of the information contained herein (including any reliance thereon) is
>> STRICTLY PROHIBITED. If you have received this e-mail in error, please
>> immediately notify the sender and delete this information from your
>> computer and destroy any related paper copies. Unless otherwise expressly
>> stated in the text of the e-mail, the addition of a typed name or initials
>> to this e-mail does not (i) evidence an intent to sign the e-mail or (ii)
>> constitute either (a) a signature or (b) consent to use electronic records
>> or signatures in place of a writing or a handwritten signature
>>
>>
>>
>> _______________________________________________
>> testing-in-python mailing list
>> testing-in-python at lists.idyll.org
>> http://lists.idyll.org/listinfo/testing-in-python
>>
>>
>
>
> --
> ------------------------------
> Harry J.W. Percival
> ------------------------------
> Twitter: @hjwp
> Mobile: +44 (0) 78877 02511
> Skype: harry.percival
>
--
------------------------------
Harry J.W. Percival
------------------------------
Twitter: @hjwp
Mobile: +44 (0) 78877 02511
Skype: harry.percival
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/testing-in-python/attachments/20140813/1e59e35c/attachment-0001.htm>
More information about the testing-in-python
mailing list