You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.6 KiB
122 lines
4.6 KiB
3 months ago
|
import unittest
|
||
|
from unittest.mock import patch, Mock
|
||
|
import requests
|
||
|
import json
|
||
|
from bilibili_search import search_bilibili, get_video_cid, fetch_danmu, count_and_rank_danmu,fetch_bilibili_videos
|
||
|
class TestBilibiliFunctions(unittest.TestCase):
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 search_bilibili 函数在成功情况下的行为
|
||
|
def test_search_bilibili_success(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.json.return_value = {'code': 0, 'data': {'result': [{'bvid': 'BV1'}]}}
|
||
|
mock_get.return_value = mock_response
|
||
|
result = search_bilibili('test', 1)
|
||
|
self.assertEqual(result, ['BV1'])
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 search_bilibili 函数在 JSON 解码错误情况下的行为
|
||
|
def test_search_bilibili_json_error(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.json.side_effect = json.JSONDecodeError('error', '', 0)
|
||
|
mock_get.return_value = mock_response
|
||
|
result = search_bilibili('test', 1)
|
||
|
self.assertEqual(result, [])
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 get_video_cid 函数在成功情况下的行为
|
||
|
def test_get_video_cid_success(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.json.return_value = {'data': {'cid': 123}}
|
||
|
mock_get.return_value = mock_response
|
||
|
result = get_video_cid('BV1')
|
||
|
self.assertEqual(result, 123)
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 get_video_cid 函数在请求失败的情况下的行为
|
||
|
def test_get_video_cid_failure(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 404
|
||
|
mock_get.return_value = mock_response
|
||
|
result = get_video_cid('BV1')
|
||
|
self.assertIsNone(result)
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 fetch_danmu 函数在成功情况下的行为
|
||
|
def test_fetch_danmu_success(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.content = b'<d>test danmu</d>'
|
||
|
mock_get.return_value = mock_response
|
||
|
result = fetch_danmu(123)
|
||
|
self.assertEqual(result, ['test danmu'])
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
#测试 fetch_danmu 函数在成功情况下的行为
|
||
|
def test_fetch_danmu_http_error(self, mock_get):
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 500
|
||
|
mock_get.return_value = mock_response
|
||
|
result = fetch_danmu(123)
|
||
|
self.assertEqual(result, [])
|
||
|
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
def test_search_bilibili_no_results(self, mock_get):
|
||
|
# 模拟没有搜索结果的API响应
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.json.return_value = {
|
||
|
'code': 0,
|
||
|
'data': {
|
||
|
'result': []
|
||
|
}
|
||
|
}
|
||
|
mock_get.return_value = mock_response
|
||
|
|
||
|
result = search_bilibili('不存在的查询词', 5)
|
||
|
self.assertEqual(result, [])
|
||
|
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
def test_search_bilibili_page_limit(self, mock_get):
|
||
|
# 模拟分页
|
||
|
mock_response = Mock()
|
||
|
mock_response.status_code = 200
|
||
|
mock_response.json.return_value = {
|
||
|
'code': 0,
|
||
|
'data': {
|
||
|
'result': [{'bvid': f'BV1J54y1D7E{page}'} for page in range(42)]
|
||
|
}
|
||
|
}
|
||
|
mock_get.return_value = mock_response
|
||
|
|
||
|
result = search_bilibili('2024巴黎奥运会', 100)
|
||
|
self.assertEqual(len(result), 100)
|
||
|
|
||
|
@patch('bilibili_search.requests.get')
|
||
|
def test_fetch_no_videos(self):
|
||
|
# # 模拟返回空的视频列表
|
||
|
mock_response = {'code': 0, 'data': {'result': []}}
|
||
|
with patch('bilibili_search.requests.get', return_value=Mock(status_code=200, json=lambda: mock_response)):
|
||
|
video_list = fetch_bilibili_videos('2024 Paris Olympics', 1)
|
||
|
self.assertEqual(video_list, [])
|
||
|
|
||
|
|
||
|
|
||
|
@patch('bilibili_search.export_to_excel')
|
||
|
def test_count_and_rank_danmu(self, mock_export):
|
||
|
# 测试弹幕统计和排名
|
||
|
danmu_texts = ['人工智能', '机器学习', '人工智能', '人工智能']
|
||
|
count_and_rank_danmu(danmu_texts)
|
||
|
|
||
|
# 检查是否调用了导出到Excel的函数
|
||
|
mock_export.assert_called_once()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|