簡體   English   中英

如何 mock.patch 在另一個模塊中導入的類

[英]How to mock.patch a class imported in another module

我有一個帶有這樣一個模塊的python類:

xy.py

from a.b import ClassA

class ClassB:
  def method_1():
    a = ClassA()
    a.method2()

然后我將 ClassA 定義為:

b.py

from c import ClassC

class ClassA:
  def method2():
      c = ClassC()
      c.method3()

現在在這段代碼中,在為 xy.py 編寫測試時我想模擬.patch ClassC,有沒有辦法在 python 中實現它?

顯然我試過:

mock.patch('a.b.ClassA.ClassC')

mock.patch('a.b.c.ClassC')

這些都沒有奏效。

您需要修補ClassC所在的位置,以便在b ClassC

mock.patch('b.ClassC')

或者,換句話說, ClassC被導入到模塊b ,因此這就是ClassC需要修補的范圍。

在哪里打補丁

patch() 通過(臨時)將名稱指向的對象更改為另一個對象。 可以有許多名稱指向任何單個對象,因此要使修補工作,您必須確保修補被測系統使用的名稱。

基本原則是在查找對象的位置打補丁,該位置不一定與定義對象的位置相同

在您的情況下,查找位置是abClassC因為您想修補ClassA使用的ClassC

import mock

with mock.patch('a.b.ClassC') as class_c:
    instance = class_c.return_value  # instance returned by ClassC()
    b = ClassB()
    b.method1()
    assert instance.method3.called == True
    

每次調用方法ClassA().method2() ,該方法都會將ClassC作為全局查找,從而在ab模塊中找到ClassC 您需要修補位置:

mock.patch('a.b.ClassC')

請參閱修補位置部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM