我一直在拉着我的头发试图找出如何sqlite3.Cursor
专门模拟这个fetchall
方法的类.
请考虑以下代码示例
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
方法,还是我做了一些可怕的错误?