[Sugar-devel] Unit testing in sugar platform: using python mock
Miguel González
migonzalvar at activitycentral.com
Wed Jul 10 11:15:29 EDT 2013
TL;DR: Python mock library is very useful. I share with you an example.
Could it be added on sugar-build?
While I was working on bringing 3G database support to sugar platform, I
needed to test persistent storage on GConf and locale environment variables.
At the end I didn't include the test for this functionality in the pull
request [1] but I would like to share with the list my approach.
Sorry because it is a long message. I will appreciate to get some feedback
about including mock library to sugar testing.
- First of all, I had to install mock [2]. I don't know how to do it
properly using osbuild. I do think it would be very useful for testing.
BTW, this library is on Python 3.3 standard library as unittest.mock.
- Then I imported patch function:
```
from mock import patch
```
- Next, I imported GConf keys an create a fake GConf client. It just a key
data store with initializable values:
```
from cpsection.modemconfiguration.model import (
GCONF_SP_COUNTRY, GCONF_SP_PROVIDER, GCONF_SP_PLAN
)
class FakeGConfClient(object):
store = {
GCONF_SP_COUNTRY: '',
GCONF_SP_PROVIDER: '',
GCONF_SP_PLAN: '',
}
def __init__(self, **kwargs):
self.store.update(kwargs)
def get_string(self, key):
return self.store[key]
def set_string(self, key, value):
self.store[key] = value
return
def get_int(self, key):
return self.store[key]
def set_int(self, key, value):
self.store[key] = value
return
```
- The test suite has 3 parts.
1. On setUp() I patch GConf.Client.get_default to use my false client:
2. On test_guess_country() I patch locale.getdefaultlocale() to return an
arbitrary value.
3. Finally I instantiate the main class and assert default country is the
expected one
```
class ServiceProvidersGuessCountry(unittest.TestCase):
def setUp(self): # (1)
gconf_patcher = patch('gi.repository.GConf.Client.get_default')
gconf_mock = gconf_patcher.start()
gconf_mock.return_value = FakeGConfClient(GCONF_SP_COUNTRY=None)
self.addCleanup(gconf_patcher.stop)
def test_guess_country(self):
LOCALE = ('hi_IN', 'UTF-8')
default_country_code = LOCALE[0][3:5].lower()
with patch('locale.getdefaultlocale') as locale_mock: # (2)
locale_mock.return_value = LOCALE
db = ServiceProvidersDatabase()
country = db.get_country()
self.assertEqual(country.code, default_country_code) # (3)
```
What do you think?
[1] https://github.com/sugarlabs/sugar/pull/58
[2] http://www.voidspace.org.uk/python/mock/
--
Miguel González
Activity Central: http://www.activitycentral.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20130710/bc2eb886/attachment.html>
More information about the Sugar-devel
mailing list