相关疑难解决方法(0)

我如何模拟django信号处理程序?

我有一个通过装饰器连接的signal_handler,这个非常简单:

@receiver(post_save, sender=User, 
          dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
   # do stuff
Run Code Online (Sandbox Code Playgroud)

我想做的是在测试中使用模拟库http://www.voidspace.org.uk/python/mock/进行模拟,以检查django调用它的次数.我的代码目前是这样的:

def test_cache():
    with mock.patch('myapp.myfile.signal_handler_post_save_user') as mocked_handler:
        # do stuff that will call the post_save of User
    self.assert_equal(mocked_handler.call_count, 1)
Run Code Online (Sandbox Code Playgroud)

这里的问题是即使被模拟也会调用原始的信号处理程序,这很可能是因为@receiver装饰器正在某处存储信号处理程序的副本,所以我在嘲笑错误的代码.

所以问题是:如何模拟我的信号处理程序以使我的测试工作?

请注意,如果我将信号处理程序更改为:

def _support_function(*args, **kwargs):
    # do stuff

@receiver(post_save, sender=User, 
          dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
   _support_function(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

而我嘲笑_support_function,一切都按预期工作.

python django signals mocking django-signals

43
推荐指数
2
解决办法
8264
查看次数

标签 统计

django ×1

django-signals ×1

mocking ×1

python ×1

signals ×1