"""EPUBSplitter 测试.""" import pytest class TestEPUBSplitterMissingDep: """缺失依赖时的行为测试(不 skip 整个文件).""" def test_split_raises_clear_import_error(self, monkeypatch): """未安装 ebooklib 时给出明确提示.""" from src.core.splitters.epub import EPUBSplitter s = EPUBSplitter() import builtins original_import = builtins.__import__ def mock_import(name, *args, **kwargs): if name == "ebooklib" or name.startswith("ebooklib."): raise ImportError("No module named 'ebooklib'") return original_import(name, *args, **kwargs) monkeypatch.setattr(builtins, "__import__", mock_import) with pytest.raises(ImportError, match="ebooklib"): s.split("dummy.epub", source_file="test.epub") class TestEPUBSplitter: """EPUBSplitter 测试(需 ebooklib).""" ebooklib = pytest.importorskip("ebooklib", reason="ebooklib 未安装") def test_split_simple_epub(self, tmp_path): """用 ebooklib 创建一个简单 EPUB 并测试分块.""" from ebooklib import epub from src.core.splitters.epub import EPUBSplitter epub_path = tmp_path / "test.epub" book = epub.EpubBook() book.set_identifier("test123") book.set_title("测试书名") book.set_language("zh") chapter = epub.EpubHtml( title="第一章", file_name="chap01.xhtml", lang="zh", ) chapter.content = "
这是EPUB电子书的内容。
第二段文字在这里。
" book.add_item(chapter) book.toc = [epub.Link("chap01.xhtml", "第一章", "chap01")] book.add_item(epub.EpubNcx()) book.add_item(epub.EpubNav()) book.spine = ["nav", chapter] epub.write_epub(str(epub_path), book) s = EPUBSplitter(max_size=500) chunks = s.split(str(epub_path), source_file="test.epub") assert len(chunks) >= 1 all_text = "".join(c["content"] for c in chunks) assert "第一章" in all_text assert "EPUB电子书" in all_text assert "第二段文字" in all_text def test_epub_has_split_method(self): """EPUBSplitter 遵循 Splitter Protocol.""" from src.core.splitters.epub import EPUBSplitter s = EPUBSplitter() assert hasattr(s, "split")