0

私は postgresql を使用しており、MagicMock を使用してテストしましたが、モックの概念を理解しているかどうかはわかりません。これは私のコード例です (私は dbname=test, table=py_test と user = simone を持っています):

    import psycopg2
    import sys
    from mock import Mock, patch
    import unittest
    from mock import MagicMock 
    from collections import Counter
    import doctest


    class db(object):
        def __init__(self,database, user):
            self.con = None
            self.database = database
            self.user = user

        def test_connection(self):
            """Connection DB"""
            try:
                self.con = psycopg2.connect(database=self.database, user=self.user)
                return True
            except psycopg2.DatabaseError, e:
                print 'Error %s' % e    
                return False

        def test_empty_table(self,table):
            """empty table?"""
            try:
                cur = self.con.cursor()
                cur.execute('SELECT * from ' + table )
                ver = cur.fetchone()
                return ver
            except psycopg2.DatabaseError, e:
                print 'Error %s' % e    

        def test_data_type(self, table, column):
            """data type"""
            try:
                cur = self.con.cursor()
                cur.execute("SELECT data_type from information_schema.columns where table_name = '"+ table + "' and column_name= '"+column+"'")
                ver = cur.fetchone()
                return ver
            except psycopg2.DatabaseError, e:
                print 'Error %s' % e    

        def __del__(self):
            if self.con:
                self.con.close()

    class test_db(unittest.TestCase):

        def testing(self):
            tdb = db('test','simone')
            self.assertTrue(tdb.test_connection(), 1)
            self.assertTrue(tdb.test_empty_table('py_test'), 1)
            self.assertTrue(tdb.test_data_type('py_test','id'), int)

    class test_mock(object):
        def __init__(self, db):
            self.db = db
        def execute(self, nomedb, user, table, field):
            self.db(nomedb, user)
            self.db.test_connection()
            self.db.test_empty_table(table)
            self.db.test_data_type(table, field)


    if __name__ == "__main__":
        c = MagicMock()
        d = test_mock(c)
        d.execute('test','simone','py_test','id')
        method_count = Counter([str(method) for method in c.method_calls])
        print c.method_calls
        print method_count
        print c.mock_calls
4

1 に答える 1

2

たぶん、Mockito パッケージを使用したモックの他の例を紹介します。

import sphinxsearch
import unittest
from mockito import mock, when, unstub, verify

class SearchManagerTest(unittest.TestCase):

    def setUp(self):
        self.sphinx_client = mock()
        when(sphinxsearch).SphinxClient().thenReturn(self.sphinx_client)

    def tearDown(self):
        unstub()

    def test_search_manager(self):
        # given
        value = {'id': 142564}
        expected_result = 'some value returned from SphinxSearch'

        # when
        search_manager = SearchManager()
        result = search_manager.get(value)

        # then
        verify(self.sphinx_client).SetServer('127.0.0.1', 9312)
        verify(self.sphinx_client).SetMatchMode(sphinxsearch.SPH_MATCH_ALL)
        verify(self.sphinx_client).SetRankingMode(sphinxsearch.SPH_RANK_WORDCOUNT)
        self.assertEqual(result, expected_result)

主な概念は、他の場所でテストされたモジュール(モック)を置き換え(独自のユニットテストモジュールがあります)、いくつかの動作を記録することです。

使用するモジュールをモックに置き換えます。

self.sphinx_client = mock()

次に、特定のメソッドを呼び出すと、このメソッドがいくつかのデータを返すことをこのモックに記録します。動作を確認する必要がある場合は、文字列やモック データなどの単純な値です。

when(sphinxsearch).SphinxClient().thenReturn(self.sphinx_client)

この場合、 sphinxsearchモジュールをインポートしてSphinxClient()を呼び出す と、モック オブジェクトが取得されることがわかります。

次に、メインのテストが行​​われます。メソッドまたはオブジェクトを呼び出してテストします (ここでは SearchManager)。その本体は、いくつかの与えられた値でテストされます:

self.search_manager = SearchManager()

セクションで、いくつかのアクションが行われたかどうかを確認する場合:

verify(self.sphinx_client).SetServer('127.0.0.1', 9312)
verify(self.sphinx_client).SetMatchMode(sphinxsearch.SPH_MATCH_ALL)
verify(self.sphinx_client).SetRankingMode(sphinxsearch.SPH_RANK_WORDCOUNT)

ここで - SetServerがパラメーター'127.0.0.1'および9312を使用してself.sphinx_clientで呼び出された場合。他の 2 行は、上記のように一目瞭然です。

ここでは、通常のチェックを行います。

self.assertEqual(result, expected_result)
于 2012-11-20T12:05:17.613 に答える