测试中record.create()返回undefined,调用setValue触发TypeError求助
问题排查:record.create返回undefined导致setValue调用失败
调用record.create({type: record.Type.CUSTOMER})时未抛出错误,但返回值为undefined,后续执行newRecord.setValue()时触发以下错误:
FAIL __tests__/customer.test.js ● Customer module › handles beforeSubmit() on CREATE TypeError: Cannot read properties of undefined (reading 'setValue') 4 | it('handles beforeSubmit() on CREATE', () => { 5 | var newRecord = record.create({type: record.Type.CUSTOMER}); > 6 | newRecord.setValue({fieldId: 'comments', value: 'TODO'}); | ^ 7 | 8 | // TODO: Test something useful 9 | }); at Object.setValue (__tests__/customer.test.js:6:15)
测试文件__tests__/customer.test.js内容如下:
import record from 'N/record'; describe('Customer module', () => { it('handles beforeSubmit() on CREATE', () => { let newRecord = record.create({type: record.Type.CUSTOMER}); newRecord.setValue({fieldId: 'comments', value: 'TODO'}); // TODO: Test something useful }); });
问题原因
在NetSuite单元测试环境中,原生N/record模块的方法不会自动提供真实实现,直接调用record.create会返回undefined——因为未对该方法做模拟(mock)处理。
解决方案
需要手动模拟record.create方法,让它返回一个包含setValue方法的模拟对象。以下是两种常见场景的修改示例:
场景1:使用Jest测试框架
import record from 'N/record'; // 模拟record模块的结构与方法 jest.mock('N/record', () => ({ Type: { CUSTOMER: 'customer' }, create: jest.fn(() => ({ setValue: jest.fn() })) })); describe('Customer module', () => { it('handles beforeSubmit() on CREATE', () => { let newRecord = record.create({type: record.Type.CUSTOMER}); newRecord.setValue({fieldId: 'comments', value: 'TODO'}); // 可添加断言验证方法调用是否符合预期 expect(record.create).toHaveBeenCalledWith({type: record.Type.CUSTOMER}); expect(newRecord.setValue).toHaveBeenCalledWith({fieldId: 'comments', value: 'TODO'}); }); });
场景2:使用NetSuite官方单元测试框架
import record from 'N/record'; import { SuiteScriptTest } from '@oracle/netsuite-unit-testing'; describe('Customer module', () => { it('handles beforeSubmit() on CREATE', () => { // 创建带模拟方法的record对象 const mockRecord = { setValue: SuiteScriptTest.mock.fn() }; // 让record.create返回模拟对象 SuiteScriptTest.mock(record, 'create').returns(mockRecord); let newRecord = record.create({type: record.Type.CUSTOMER}); newRecord.setValue({fieldId: 'comments', value: 'TODO'}); // 验证方法调用逻辑 SuiteScriptTest.expect(record.create).toHaveBeenCalledWith({type: record.Type.CUSTOMER}); SuiteScriptTest.expect(mockRecord.setValue).toHaveBeenCalledWith({fieldId: 'comments', value: 'TODO'}); }); });
内容的提问来源于stack exchange,提问作者Marty C.
相关产品推荐
相关产品推荐

