0

このシナリオを立てよう

# This code lives in lolcat-web/lolapps/lolburger/burger.py
import os
from helper.lib import price

def i_haz_cheezeburger(Burger, user):

    kings_burgers = []
    queens_burgers = []
    address = os.path.join(user.hometown, burger_king_addr)
    burger_menu = Burger.menu()
    for burger in burger_menu:
       if burger == 'King':

            kings_burgers.append({
                    'name': burger, 
                    'price': price(burger)
                   })
       else:
            queens_burgers.append(...)

    return (kings_burgers, queens_burgers)

i_haz_cheezeburger関数が正しい値を含むタプルを返すかどうかをテストしたいと思います。いくつかの要素 (簡略化) に依存します: oshelper.lib.priceBurger、およびuser(ユーザー クラス)

私はmockMichael Foordによってかなり新しいので、ここに私の初心者の試みがあります:

どこでも使用されていないように見えるためjoiner編集が間違っているように見えますか?price

def test_01(unittest.TestCase):
   with patch('os.path.join') as joiner:
      with patch('lolcat-web.lolapps.lolburger.burger.price') as price: 
          mock_user = MagicMock(name='user', spec=client.auth.User)
          mock_user.hometown = 'New-York'
          mock_burger = MagicMock(name='burger', spec=lolcat-web.lolapps.lolburger.Burger)
          mock_burger.menu = [ '....sets up a list of samples .....' ]

          # now call the function
          response = i_get_cheezeburger(mock_burger, mock_user)
   # now we do some assertions.....

これは筆記具のようなものです。メソッドi_haz_cheezeburgerにさらにいくつかの依存関係がある場合はどうなりますか。もちろん、それらをリファクタリングして、さらにいくつかのラッパー/ヘルパー関数を作成できます。しかし、問題は、または少なくとも 混乱です: 出力をテストしたいです。「ああ、定義された戻り値で渡されたため、スペルミス/バインドされていない割り当てはありません」と知りたくはありませんが、フィクスチャ(または のようなものの戻り値Burger.menu)を設定するのは正しく聞こえません。

この種の問題に対処する適切な方法は何ですか? 私の誤解を正してください。

4

1 に答える 1

3

標準ライブラリをモック アウトしないでください。標準ライブラリに問題がある場合は、より大きな問題が発生します (言うまでもなく、標準ライブラリの統合テストを行っていないことはほぼ確実です。そのため、モック アウトすることは、潜在的な失敗を隠しているだけです)。

関数の出力が の戻り値に依存する場合、戻り値をテストするには、 のモック バージョンのBurger.menu()戻り値を設定する必要があります。Burger.menu()それは正しいことです。現実世界の入力の制御されたバージョンであるモック入力を提供するため、それらの制御された入力が与えられた場合に特定の出力が期待されます。を使用しても、実際の現実的なデータがすべてmock方程式から魔法のように削除されるわけではありません。

于 2012-04-10T20:41:34.620 に答える