Я вытаскиваю свои волосы, пытаясь понять, как издеваться над классом sqlite3.Cursor
, в частности, с методом fetchall
.Как я могу издеваться над sqlite3.Cursor
Рассмотрим следующий пример кода
import sqlite3
from mock import Mock, patch
from nose.tools import assert_false
class Foo:
def check_name(name):
conn = sqlite3.connect('temp.db')
c = conn.cursor()
c.execute('SELECT * FROM foo where name = ?', name)
if len(c.fetchall()) > 0:
return True
return False
@patch('sqlite3.Cursor.fetchall', Mock(return_value=['John', 'Bob']))
def test_foo():
foo = Foo()
assert_false(foo.check_name('Cane'))
Бег nosetests
результаты не весело ошибок
E
======================================================================
ERROR: temp.test_foo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/koddsson/.virtualenvs/temp/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/home/koddsson/.virtualenvs/temp/lib/python2.7/site-packages/mock.py", line 1214, in patched
patching.__exit__(*exc_info)
File "/home/koddsson/.virtualenvs/temp/lib/python2.7/site-packages/mock.py", line 1379, in __exit__
setattr(self.target, self.attribute, self.temp_original)
TypeError: can't set attributes of built-in/extension type 'sqlite3.Cursor'
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Если я не смогу издеваться метод fetchall
или я делаю что-то ужасно неправильно?
См. [В Python, как издеваться над классом расширения AC?] (Http://stackoverflow.com/q/17267587/222914) –
@JanneKarila Я пробовал это, но теперь я получаю AssertionError https: // gist .github.com/anonymous/7931550: < –
Я думаю, вы исправляете неправильный уровень. Лично я исправлял сам sqlite3 и высмеивал метод fetch_all следующим образом: https://gist.github.com/alexcouper/eec0d38454ce4bc43c6b –