【问题标题】:Class mocking in Django testsDjango 测试中的类模拟
【发布时间】:2013-11-05 11:32:28
【问题描述】:

我正在使用 mock 1.0.1 (http://www.voidspace.org.uk/python/mock/) 在我的测试中模拟对象,并且我可以使用这种方法模拟日期:

def dateStub():
    return timezone.make_aware(datetime(2013, 1, 1, 10, 30), timezone.utc)


@patch('django.utils.timezone.now', dateStub)
def testFoo(self):
    ...

但是,现在我正在尝试模拟一个类,但同样的方法没有按预期工作:

class FakeClass(OriginalClass)
    def method(self):
        pass


@patch('myapp.mymodule.OriginalClass', FakeClass)
def testFoo(self):
    ...

我也尝试使用@path.object 并仅替换类方法,但没有运气......在测试中模拟类的正确方法是什么? (该类由我正在测试的类在内部使用)

【问题讨论】:

  • 能否包含使用OriginalClass 的代码? OriginalClass 是从另一个模块导入的还是在 myapp.mymodule 中定义的?
  • 类 OriginalClass 在 myapp.mymodule.OriginalClass 中定义,在我的测试中我使用另一个导入它的类...实际上我有:带有 testFoo() 方法的 TestClassA(测试类)并在其中 ClassA() 方法“方法”中使用 OriginalClass (位于单独的模块中)
  • 那不会嘲笑班级。您需要确保在真实代码中实例化的地方模拟 OriginalClass。 OriginalClass 是否可能在那个单独的模块中实例化并存储在全局变量中?
  • OriginalClass 被导入到其他模块中使用:“from myapp.mymodule.OriginalClass import OriginalClass”,甚至 django.utils.timezone 也以相同的方式导入到其他类中并且是可修补的......为什么?
  • 不同之处在于now() 是您要模拟的函数,但调用OriginalClass() 意味着您正在实例化一个实例,因此有时您需要模拟OriginalClass.return_value。见:mock.readthedocs.org/en/latest/…

标签: python django unit-testing mocking


【解决方案1】:

我解决了!

工作解决方案如下:

...
from myapp.mymodule.OriginalClass import OriginalClass

def methodStub(self):
    return

class TestMyClass(TestCase):

    @patch.object(OriginalClass, 'method', methodStub)
    def testFoo(self):
        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2021-11-26
    相关资源
    最近更新 更多