4

私は単体テストを書いていますが、ほとんどの場合、引数が特別な値「挿入」を取得する場合を除いて、メソッド自体として動作するようにメソッド呼び出しをモックする必要があります。簡略化された製品コードは次のとおりです。

class CommandServer(object):
    def __init__(self):
        self.rowcount = None
    def runSQL(self, sql):
        print "Do something useful"
        self.rowcount=5
        return self

class Process(object):
    def process(self):
        cs = CommandServer()
        cs.runSQL("create table tbl1(X VARCHAR2(10))")
        r = cs.runSQL("insert into tbl1 select * from tbl2")
        print "Number of rows: %s" % r.rowcount

p = Process()
p.process()

印刷する

Do something useful
Do something useful
Number of rows: 5

次のコードを使用して、自分でモック バージョンを作成できます。

runSQL = CommandServer.runSQL
def runSQLPatch(self, sql):
    if sql.lstrip().startswith('insert into'):
        print "Patched version in use"
        class res(object):
            rowcount = -1
        return res
    else:
        return runSQL(self, sql)
CommandServer.runSQL = runSQLPatch

p = Process()
p.process()

印刷する

Do something useful
Patched version in use
Number of rows: -1

mock ライブラリを使用して同じことを達成したい(これはpython 3に含まれるライブラリだと思います)。どうやってやるの?(パイソン 2.6.2)

4

1 に答える 1

1

完全に明確にするために、それはpython 3.3にのみ含まれています(これを学べてとてもうれしいです、ありがとう!)。

それ以外の場合、使用できるパターンは

from mock import patch

with patch.object(CommandServer, 'runSQL') as runSQL:
    class res(object):
       rowcount = -1

    runSQL.return_value = res

    p = Process()
    p.process()

    for c in runSQL.call_list:
        assert c[1].lstrip().startswith('insert into') is True

ただし、これは、送信している場合だけでなく、すべての場合をカバーします'insert into'。これはどこを見るべきかについてのヒントを与えるかもしれませんが、そうでなければ、あなたが探していることがモックで正確に可能だとは思いません.

于 2013-02-05T16:03:49.940 に答える