Tôi đã kéo tóc ra cố gắng tìm ra cách chế tạo lớp sqlite3.Cursor
cụ thể là phương pháp fetchall
.Làm thế nào tôi có thể thử sqlite3.Cursor
xem xét mẫu mã sau đây
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'))
Chạy nosetests
kết quả trong không có lỗi vui
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)
Tôi có nên không thể thử phương pháp fetchall
hoặc tôi đang làm một cái gì đó khủng khiếp sai?
Xem [Trong Python, làm thế nào để giả lập lớp mở rộng ac?] (Http://stackoverflow.com/q/17267587/222914) –
@JanneKarila Tôi đã thử nhưng bây giờ tôi nhận được một AssertionError https: // gist .github.com/anonymous/7931550: < –
Tôi nghĩ bạn đang vá ở cấp độ sai. Cá nhân tôi muốn vá ra sqlite3 chính nó và giả định phương thức fetch_all như vậy: https://gist.github.com/alexcouper/eec0d38454ce4bc43c6b –