python中的模拟行为,只关心其中一个参数

时间:2013-11-27 21:03:03

标签: python mocking assertions

我正在使用魔术模拟进行一些我正在进行的python测试。有一个功能

sendmail()
查看源代码的

定义如下

def sendmail(sender, 
         addrs, 
         subject, 
         body, 
         format               = 'plain', 
         cc                   = [], 
         bcc                  = [], 
         replyTo              = [],
         attach               = [], 
         useOutlook           = False,
         force                = False,  ## UNUSED!
         priority             = None,
         addStandardBobFooter = True
         ):

这一点并不重要。我希望我的测试做的是确认这是发送一个包含正确主题的电子邮件。所以我到目前为止所做的是......

sendmail = MagicMock()
self._fundingRollsPublisher.publish()  #this function contains a call to sendmail()

在发布代码中,我们有

def publish(): 

#much more code
sendmail(mail_from, mail_to, subject, body, format = 'html')

对于迄今为止冗长的解释感到抱歉,但这是所有背景知识。我如何确认正在使用给定主题调用发送邮件功能...如果我想要主题是“紧急”,那么我想做一些事情的效果

sendmail.assert_called_with(subject= "URGENT")

当我尝试这个时,它似乎不起作用。任何人都知道一种方法,只关心其中一个变量?

1 个答案:

答案 0 :(得分:0)

你可以做这样的事情

class MagicMock:
    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs

    def assert_subject(self, subject):
        assert len(self.args) > 2 and self.args[2] == subject) or self.kwargs.get('subject', None) == subject, "Unexpected subject"