2013-05-01 8 views
7

私はnosetestsを使用しています.2つの別々のファイルには2つのテストがあります。個別に実行するとどちらも正常に動作しますが、一緒に実行されると、最初のテストの模擬テストは2番目のテストの結果を混乱させます。テスト機能の終了後、すべてのモック/パッチをリセットして、毎回クリーンなテストを受けるようにするにはどうすればよいですか?Python - テスト中にモックをアンロック/リセットする方法

可能であれば、私のテストを通じて説明することが可能です。私の最初のテストは、次のようになります。

def test_list_all_channel(self): 
    from notification.models import Channel, list_all_channel_names 
    channel1 = Mock(); 
    channel2 = Mock(); 
    channel3 = Mock(); 
    channel1.name = "ch1" 
    channel2.name = "ch2" 
    channel3.name = "ch3" 
    channel_list = [channel1, channel2, channel3] 
    Channel.all = MagicMock() 
    Channel.all.return_value = channel_list 
    print Channel 
    channel_name_list = list_all_channel_names() 
    self.assertEqual("ch1", channel_name_list[0]) 
    self.assertEqual("ch2", channel_name_list[1]) 
    self.assertEqual("ch3", channel_name_list[2]) 

そして、私の第二の試験は、次のとおりです。

def test_can_list_all_channels(self): 
    add_channel_with_name("channel1") 
    namelist = list_all_channel_names() 
    self.assertEqual("channel1", namelist[0]) 

しかしChannel.all(からの戻り値)Iが得るので、まだ `最初の関数からリストに設定されています"ch1"は "channel1"と等しくありません。助言がありますか?大変ありがとう!

p.stop() 

これは、あなたのモックがに隔離されていることを確認します:

答えて

10

あなたがあなたのパッチを開始し、終了時

p = patch("Channel.all", new=MagicMock(return_value=channel_list)) 
p.start() 

を実行し、テストの開始時にhttp://www.voidspace.org.uk/python/mock/patch.html

を見上げてテスト。

+0

パッチ外のモック関数についてはどうですか?これを行う唯一の方法は、それらを最初にパッチすることですか? – golmschenk

+0

はい。組み込みのunittestフレームワークを使用することをお勧めします。こうすることで、setUpメソッドとtearDownメソッドを使ってパッチを作成/破棄することができます。 –

+0

こんにちは@jjia6395括弧がないか、あまりにも多くのものがありますか? –

関連する問題