You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试中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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:00:17