Ich teste eine Klasse, die peewee für ORM verwendet. Ich habe mock für den Test verwendet und versucht zu überprüfen, ob der richtige Wert für das Attribut des Modells festgelegt wurde, aber was ich für das Attribut im Konstruktor des Modells festgelegt habe Bei der Übergabe als Argument mit einem Schlüsselwort konnte die mock.Mock-Klasse nicht so gut getestet werden, wie sie ist. Daher habe ich ein mock erstellt, das das Argument mit einem Schlüsselwort auf ein Attribut setzt.
Übrigens bin ich in Python erst zwei Monate alt, und ich habe möglicherweise einen großen Fehler gemacht, und es gibt möglicherweise einen intelligenteren Weg. Wenn jemand Fehler oder bessere Wege kennt, wäre er sehr dankbar, wenn Sie einen Kommentar abgeben könnten.
Nachtrag vom 15.10.2016 Der Code in diesem Artikel unterstützt nur den Fall, dass nur ein Mock erstellt wird. Bei mehreren Instanziierungen müssen Sie im Kommentar eine Methode wie @ podhmos beispielhafter Code verwenden.
$ pip install peewee
$ pip install mock
$ tree
.
├── src
│ ├── __init__.py
│ ├── model.py
│ └── service.py
└── test
├── __init__.py
└── test_service.py
src/service.py
# -*- coding: utf-8 -*-
from model import HogeModel
class HogeService(object):
def run(self):
model = HogeModel(name='hoge name')
model.desc = 'hoge desc'
model.save()
src/model.py
# -*- coding: utf-8 -*-
from peewee import SqliteDatabase
from peewee import Model
from peewee import PrimaryKeyField
from peewee import CharField
db = SqliteDatabase('hoge.db')
class HogeModel(Model):
id = PrimaryKeyField
name = CharField()
desc = CharField()
class Meta:
database = db
test/test_service.py
# -*- coding: utf-8 -*-
import unittest
from mock import patch
from mock import Mock
from service import HogeService
class TestHogeService(unittest.TestCase):
@patch('service.HogeModel')
def test_run(self, mock_hoge_model):
mock = Mock()
mock_hoge_model.return_value = mock
target = HogeService()
target.run()
self.assertEquals(1, mock.save.call_count) # OK
self.assertEquals('hoge desc', mock.desc) # OK
self.assertEquals('hoge name', mock.name) # NG
if __name__ == '__main__':
unittest.main()
$ PYTHONPATH=src python test/test_service.py
F
======================================================================
FAIL: test_run (__main__.TestHogeService)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/otti/.pyenv/versions/2.7.12/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
return func(*args, **keywargs)
File "test/test_service.py", line 18, in test_run
self.assertEquals('hoge name', mock.name) # NG
AssertionError: 'hoge name' != <Mock name='HogeModel().name' id='4454023888'>
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
test/test_service.py
# -*- coding: utf-8 -*-
import unittest
from mock import Mock
from mock import patch
from service import HogeService
class TestHogeService(unittest.TestCase):
def create_attr_set_mock(self, **kwargs):
self.mock = Mock()
#Setzen Sie das im Konstruktor übergebene Schlüsselwortargument auf das Attribut
for k, v in kwargs.items():
self.mock.__dict__[k] = v
return self.mock
@patch('service.HogeModel')
def test_run(self, mock_hoge_model):
#Gibt ein Modell zurück, das beim Instanziieren der Zielklasse ein Attribut mit einem Schlüsselwortargument im Konstruktor festlegt
mock_hoge_model.side_effect = lambda **kwargs: self.create_attr_set_mock(**kwargs)
target = HogeService()
target.run()
self.assertEquals(1, self.mock.save.call_count) # OK
self.assertEquals('hoge desc', self.mock.desc) # OK
self.assertEquals('hoge name', self.mock.name) # OK
if __name__ == '__main__':
unittest.main()
PYTHONPATH=src python test/test_service.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Jetzt haben Sie ein Modell, das wie erwartet funktioniert. Es war ein bisschen verwirrend, weil mock.Mock an erster Stelle ein Attribut namens name zu haben scheint, aber es war das gleiche, auch wenn ich es mit anderen Attributen als name versucht habe.
Recommended Posts