2013-12-12 3 views
5

模擬することができます。は、どのように私は、具体的<code>fetchall</code>方法を<code>sqlite3.Cursor</code>クラスをモックする方法を理解しようとしている私の髪を引っ張ってきたsqlite3.Cursor

は私がfetchall方法を模擬できないようにする必要がありノー楽しいエラー

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) 

nosetests結果を実行する次のコードサンプル

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')) 

を考えてみましょうか、私は恐ろしく間違って何かをやっていますか?

+1

[Pythonで、どのようにACエクステンションクラスを模擬するのですか?](http://stackoverflow.com/q/17267587/222914) –

+1

@JanneKarila私はそれを試みましたが、今はAssertionError https:// gist .github.com/anonymous/7931550:< –

+2

あなたは間違ったレベルでパッチを当てていると思います。個人的には、sqlite3自体をパッチして、fetch_allメソッドをモックしてみましょう。https://gist.github.com/alexcouper/eec0d38454ce4bc43c6b –

答えて

4

私はあなたのモジュールにインポートsqlite3のをパッチ適用のアプローチを取り、そこから動作します。

はのは、あなたのモジュールがwhat.py名付けていると仮定しましょう。

私はwhat.sqlite3をパッチアウトし、戻り値.connect().cursor().fetchallをモックします。ここで

は、より完全な例です:

from mock import patch 
from nose.tools import assert_true, assert_false 

from what import Foo 

def test_existing_name(): 
    with patch('what.sqlite3') as mocksql: 
     mocksql.connect().cursor().fetchall.return_value = ['John', 'Bob'] 
     foo = Foo() 
     assert_true(foo.check_name('John')) 
-3

あなたはすべてを模擬することはできませんし、データベースは特にトリッキーです。私はよく模擬データでテスト・データベースをロードし、テスト(すなわち備品)でそれを使用することです(それはとても簡単ですので、ESP。Sqliteを持つ)を行うには正しいことがわかります。結局のところ、実際にテストする必要があるのは、コードがデータベースに正しくアクセスしてクエリを実行しているかどうかです。

通常、このようなテストで答えようとしている質問は、「DBにXデータがあり、クエリYを実行すると、そのクエリは私が期待したようにZを返します」、パラメータXを自分のメソッドに渡します。値Zを返します(データベースからYを取得することに基づいています)。あなたの例では

は、本当の問題は、「この方法では、右のクエリSELECT * FROM foo where name = ?ですか?」あなたが応答を嘲笑するなら、あなたはそれに答えることはありません。

2

私は私のテストでsqlite3.Cursorを模擬する方法を発見した:

cursor = MagicMock(Cursor) 
cursor.fetchall.return_value = [{'column1': 'hello', 'column2': 'world'}] 

私はpythonでかなり新しいですが、どのように私、これはありますJavaでやってください。

関連する問題

 関連する問題