Spaces:
Sleeping
Sleeping
| import unittest | |
| from unittest.mock import patch, MagicMock | |
| import sys | |
| import os | |
| from io import StringIO | |
| # 添加 src 目录到模块搜索路径,以便可以导入 src 目录中的模块 | |
| sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src'))) | |
| from hacker_news_client import HackerNewsClient | |
| from logger import LOG # 导入日志记录器 | |
| class TestHackerNewsClient(unittest.TestCase): | |
| def setUp(self): | |
| self.client = HackerNewsClient() | |
| def test_fetch_top_stories_success(self, mock_get): | |
| # 模拟HTTP响应 | |
| mock_response = MagicMock() | |
| mock_response.status_code = 200 | |
| mock_response.text = ''' | |
| <tr class="athing"> | |
| <td class="title"> | |
| <span class="titleline"> | |
| <a href="https://news.ycombinator.com/">Story 1</a> | |
| </span> | |
| </td> | |
| </tr> | |
| ''' | |
| mock_get.return_value = mock_response | |
| # 调用方法并验证返回值 | |
| top_stories = self.client.fetch_top_stories() | |
| self.assertEqual(len(top_stories), 1) | |
| self.assertEqual(top_stories[0]['title'], 'Story 1') | |
| self.assertEqual(top_stories[0]['link'], 'https://news.ycombinator.com/') | |
| def test_fetch_top_stories_failure(self, mock_get): | |
| # 模拟HTTP请求失败 | |
| mock_get.side_effect = Exception("Connection error") | |
| # 调用方法并验证返回值 | |
| top_stories = self.client.fetch_top_stories() | |
| self.assertEqual(top_stories, []) | |
| def test_export_top_stories(self, mock_open, mock_makedirs, mock_get): | |
| # 模拟HTTP响应 | |
| mock_response = MagicMock() | |
| mock_response.status_code = 200 | |
| mock_response.text = ''' | |
| <tr class="athing"> | |
| <td class="title"> | |
| <span class="titleline"> | |
| <a href="https://news.ycombinator.com/">Story 1</a> | |
| </span> | |
| </td> | |
| </tr> | |
| ''' | |
| mock_get.return_value = mock_response | |
| # 调用方法 | |
| file_path = self.client.export_top_stories(date="2024-09-01", hour="14") | |
| # 验证目录和文件创建 | |
| mock_makedirs.assert_called_once_with('hacker_news/2024-09-01', exist_ok=True) | |
| mock_open.assert_called_once_with('hacker_news/2024-09-01/14.md', 'w') | |
| # 验证文件内容 | |
| mock_open().write.assert_any_call("# Hacker News Top Stories (2024-09-01 14:00)\n\n") | |
| mock_open().write.assert_any_call("1. [Story 1](https://news.ycombinator.com/)\n") | |
| def test_export_top_stories_no_stories(self, mock_open, mock_makedirs, mock_get): | |
| # 模拟HTTP响应为空 | |
| mock_response = MagicMock() | |
| mock_response.status_code = 200 | |
| mock_response.text = '<html></html>' | |
| mock_get.return_value = mock_response | |
| # 调用方法 | |
| file_path = self.client.export_top_stories(date="2024-09-01", hour="14") | |
| # 验证没有创建文件 | |
| mock_makedirs.assert_not_called() | |
| mock_open.assert_not_called() | |
| self.assertIsNone(file_path) | |
| if __name__ == '__main__': | |
| unittest.main() | |