Python:理解带有unittests的magicmock的问题

Python:理解带有unittests的magicmock的问题,python,unit-testing,magicmock,Python,Unit Testing,Magicmock,这是我的班级: class WorkflowsCloudant(cloudant.Account): def __init__(self, account_id): super(WorkflowsCloudant, self).__init__(settings.COUCH_DB_ACCOUNT_NAME, auth=(settings.COUCH_PUBLIC_KEY, s

这是我的班级:

class WorkflowsCloudant(cloudant.Account):

    def __init__(self, account_id):
        super(WorkflowsCloudant, self).__init__(settings.COUCH_DB_ACCOUNT_NAME,
                                                auth=(settings.COUCH_PUBLIC_KEY, settings.COUCH_PRIVATE_KEY))
        self.db = self.database(settings.COUCH_DB_NAME)
        self.account_id = account_id

    def get_by_id(self, key, design='by_workflow_id', view='by_workflow_id', limit=None):
        params = dict(key=key, include_docs=True, limit=limit)
        docs = self.db.design(design).view(view, params=params)

        if limit is 1:
            doc = [doc['doc'] for doc in docs]

            if doc:
                workflow = doc[0]

                if workflow.get("account_id") != self.account_id:
                    raise InvalidAccount("Invalid Account")

                return workflow
            else:
                raise NotFound("Autoresponder Cannot Be Found")

        return docs
这是我的测试:

def test_get_by_id_single_invalid_account(self):
    self.klass.account_id = 200
    self.klass.db = mock.MagicMock()
    self.klass.db.design.return_value.view.return_value = [{
        'doc': test_workflow()
    }]
    # wc.get_by_id = mock.MagicMock(side_effect=InvalidAccount("Invalid Account"))
    with self.assertRaises(InvalidAccount("Invalid Account")) as context:
        self.klass.get_by_id('workflow_id', limit=1)

    self.assertEqual('Invalid Account', str(context.exception))

我试图通过上面的测试来简单地引发
InvalidAccount
的异常,但我不确定如何模拟
self.db.design.view
响应。这就是导致我的测试失败的原因,因为它试图发出一个真正的呼唤

我想这就是你想要的

def test_get_by_id_single_invalid_account(self):
    self.klass.account_id = 200
    self.klass.db = mock.MagicMock()
    self.klass.db.design = mock.MagicMock()
    view_mock = mock.MagicMock()
    view_mock.return_value =[{
        'doc': test_workflow()
    }]
    self.klass.db.design.return_value.view = view_mock 
    # wc.get_by_id = mock.MagicMock(side_effect=InvalidAccount("Invalid Account"))
    with self.assertRaises(InvalidAccount("Invalid Account")) as context:
        self.klass.get_by_id('workflow_id', limit=1)

    self.assertEqual('Invalid Account', str(context.exception))

这让我更接近了!由于某种原因,
NotFound
的异常被抛出。。。可能是因为某些东西被模仿的方式把它弄明白了!不是
self.klass.db.design.return\u value=view\u mock
而是
self.klass.db.design.return\u value.view=view\u mock
@啊,很抱歉。我将编辑我的答案以反映更正。非常感谢您的帮助!