1

我有以下项目结构:

tests/
└── messenger/
    └── messaging_test.py
app/
├── __init__.py
├── models.py
└── messenger/
    ├── __init__.py
    └── messaging.py

messaging.py模块内部有一个send_schedule带有以下几行的函数:

talks = models.Talk.query.all()
raise ValueError(str(talks))  # the debug output

我正在尝试修补models.Talk.query.all()通话。里面messaging_test.py有以下测试:

@patch('app.models.Talk.query.all')
def test_send_schedule(self, all_query_mock):
    all_query_mock.return_value = []
    for talk_id in range(1, 6):
        talk_mock = MagicMock(id=talk_id, title=str(talk_id), speaker_facebook_id=1)
        all_query_mock.return_value.append(talk_mock)
    with vcr.use_cassette('vcr_cassettes/send_schedule.yaml'):
        response = messaging.send_schedule(self.access_token, self.user_id)

    self.assertTrue('recipient_id' in response)
    self.assertTrue('message_id' in response)
    self.assertEqual(response['recipient_id'], self.user_id)

当我使用python3 -m pytest tests/messenger/messaging_test.py命令运行测试时,ValueError输出一个空列表,这表示调用没有被修补。你能建议解决这个问题吗?

我做了什么来解决这个问题:

  • 阅读文档的“修补位置”段落。这让我怀疑pytest以一种奇怪的方式运行我的测试。
  • 尝试使用pytest-mock但未能弄清楚如何将其与unittest.TestCase.
4

1 回答 1

0

好吧,我显然对此做了不好的研究。pytest模块没有问题。为了解决这个问题,我需要打补丁app.models.Talk,而不是奇怪的app.models.Talk.query.all. 在我修补类之后,我只是添加了我需要的属性:

    @patch('app.models.Talk')
def test_send_schedule(self, talk_class_mock):
    talk_mocks = []
    for talk_id in range(1, 6):
        talk_mock = MagicMock(id=talk_id, title=str(talk_id), speaker_facebook_id=1)
        talk_mocks.append(talk_mock)
    query_mock = MagicMock(all=MagicMock(return_value=talk_mocks))
    talk_class_mock.query = query_mock
    with vcr.use_cassette('vcr_cassettes/send_schedule.yaml'):
        response = messaging.send_schedule(self.access_token, self.user_id)

    self.assertTrue('recipient_id' in response)
    self.assertTrue('message_id' in response)
    self.assertEqual(response['recipient_id'], self.user_id)
于 2017-04-16T14:03:47.267 回答