Follow-up on unit testing layered charms

Stuart Bishop stuart.bishop at canonical.com
Sat Sep 10 03:53:20 UTC 2016


On 9 September 2016 at 01:03, Pete Vander Giessen <
pete.vandergiessen at canonical.com> wrote:

> Hi All,
>
> > Stuart Bishop wrote:
> > The tearDown method could reset the mock easily enough.
>
> If only it were that simple :-)
>
> To patch imports, the harness was actually providing a context that you
> could use the wrap the imports at the top of your test module. That solved
> the immediate issue of executing imports without errors, but it created a
> very complex situation when you went to figure out which references to
> cleanup or update when you wanted to reset mocks. You also weren't able to
> clean them up in tearDown, or even tearDownClass, because you had to handle
> the situation where you had multiple test classes in a module.
>
> One workaround is to do your imports inside of the setUp for a test. That
> didn't feel like the correct way to do things in a library meant for
> general use, where I'd prefer to stick to things that don't make Guido sad.
> I wouldn't necessarily object to the technique if it came up in a code
> review for a specific charm, though :-)
>

I'm thinking you insert a MagicMock into sys.modules instead of an import
statement (this is how we do it in the telegraf charm, and I'm sure helpers
could make this nicer):

# Mock layer modules
import charms
promreg = MagicMock()
charms.promreg = promreg
sys.modules['charms.promreg'] = promreg

To reset, you just iterate over sys.modules and reset everything that is a
MagicMock (or anything with a reset_mock() method). There is no need to
figure which to reset, since you want all of them reset every test to
preserve test isolation. I haven't actually tried this bit yet.

If you are using the standard Python unittest feature set, I think you
would need a TestCase subclass to do the reset. If you are using py.test, I
think it has features that can do this magically.

A moduleTearDown would be required if you want to remove the mocks from
sys.modules (or py.test magic). But I don't think we need to bother.



-- 
Stuart Bishop <stuart.bishop at canonical.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/juju/attachments/20160910/a94f16ce/attachment.html>


More information about the Juju mailing list