如何对SharePoint WebPart的CRUD方法进行单元测试?
问题分析
你的核心问题是服务类依赖WebPartContext和getSP函数,无法直接实例化进行方法测试。解决思路是mock所有外部依赖,让测试只聚焦于sp_createItem的逻辑本身,不需要真实的SharePoint环境。
具体实现步骤
1. 准备测试环境
确保测试文件导入必要模块,同时mockgetSP函数(根据你的实际导入路径调整)。
2. 完整测试代码
以下是覆盖成功、失败场景的测试用例:
import PnpServices from './pnpservices'; // 假设getSP来自@pnp/sp,根据实际导入路径修改 import { getSP } from '@pnp/sp'; // Mock getSP函数,返回自定义的_sp对象 jest.mock('@pnp/sp', () => ({ getSP: jest.fn() })); describe('PnpServices', () => { let mockSp: any; let mockAddItem: jest.Mock; beforeEach(() => { // 重置所有mock状态 (getSP as jest.Mock).mockClear(); // 模拟items.add方法的成功返回 mockAddItem = jest.fn().mockResolvedValue({ data: { Id: 123 } }); // 构建链式调用的mock对象 mockSp = { web: { lists: { getByTitle: jest.fn().mockReturnValue({ items: { add: mockAddItem } }) } } }; // 让getSP返回我们的mock对象 (getSP as jest.Mock).mockReturnValue(mockSp); }); it('sp_createItem 成功创建条目时应返回ID', async () => { // 构造空的mock上下文(getSP已被mock,无需真实属性) const mockContext = {} as any; const service = new PnpServices(mockContext); const result = await service.sp_createItem('TestList', { Title: 'Test Item' }); // 验证依赖调用逻辑 expect(getSP).toHaveBeenCalledWith(mockContext); expect(mockSp.web.lists.getByTitle).toHaveBeenCalledWith('TestList'); expect(mockAddItem).toHaveBeenCalledWith({ Title: 'Test Item' }); // 验证返回结果 expect(result).toBe(123); }); it('sp_createItem 失败时应抛出指定错误', async () => { // 修改mock为失败状态 mockAddItem.mockRejectedValue(new Error('SP API Error')); const mockContext = {} as any; const service = new PnpServices(mockContext); // 验证错误抛出逻辑 await expect(service.sp_createItem('TestList', { Title: 'Test Item' })).rejects.toThrow('error'); }); });
关键说明
- Mock外部依赖:通过
jest.mock覆盖getSP,避免依赖真实的SharePoint上下文,让我们完全控制_sp对象的行为。 - 链式调用Mock:逐层mock PnP JS的链式API(
web→lists→getByTitle→items→add),确保每个环节的调用都能返回预期的mock对象。 - 避免mock服务类本身:你之前的
jest.mock('./pnpservices')会mock整个类,导致无法测试真实的方法逻辑,应该mock服务类的外部依赖而非类本身。 - 场景覆盖:同时测试成功和失败场景,确保方法的异常处理逻辑也符合预期。
内容的提问来源于stack exchange,提问作者dreamy
相关产品推荐
相关产品推荐

