excel 如何使用Office-Addin-Mock在office-js中模拟NamedItemCollection

k4emjkb1  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(139)

我试图模拟Excel的命名范围数组,这样我就可以运行一些添加和删除自定义范围的测试,但似乎模拟对象没有配备处理数组?
使用笑话和Angular 。
根据文档,我模拟Host对象并将其分配给global.Excel

it('should delete the first item', async () => {

    const workbookWithNamedRanges = {
      context: {
        workbook: {
          names: {
            items: [
              {
                name: 'Test 1',
                type: 'Error'
              },
              {
                name: 'Test 2',
                type: 'Error'
              },
            ]
          }
        }
      },
      run: async function (callback: any) {
        await callback(this.context);
      }
    };

    const excelMock = new OfficeMockObject(workbookWithNamedRanges) as any;

    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    global.Excel = excelMock;

    await service.service.removeFirstItem();

    expect(excelMock.context.workbook.names.items.length).toBe(1);
  });
});

那么在我的服务中,

async removeFirstItem(): Promise<void> {

    
    await Excel.run<void>(async context => {
      workbook = context.workbook;

      const namedRanges: Excel.NamedItemCollection = workbook.names.load() // <- Error here at .load;
      await context.sync();

      namedRanges.items.at(0)?.delete();

      await context.sync();

    });
}

但是.load上存在以下错误

Cannot convert undefined or null to object
TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)

我也尝试过将workbook.names.load()更改为context.load(workbook.names,'items'),这产生了不同的错误:

Error: Property _properties needs to be present in object model before load is called.

    at C:\Users\User\Addins\addins\node_modules\office-addin-mock\src\officeMockObject.ts:168:15
    at Array.forEach (<anonymous>)
    at OfficeMockObject.parseObjectPropertyIntoArray (C:\Users\User\Addins\addins\node_modules\office-addin-mock\src\officeMockObject.ts:148:29)
    at OfficeMockObject.load (C:\Users\User\Addins\addins\node_modules\office-addin-mock\src\officeMockObject.ts:41:25)

然后我也尝试了workbook.names.load('items '),但这产生了一个意想不到的行为,它工作,但workbook.names.items是未定义的,即使它是明确定义的。
值得注意的是,代码可以与上述所有3种方法一起工作,就像在正常的插件环境中一样。
有什么建议吗?

q9rjltbz

q9rjltbz1#

尝试将服务代码更改为对工作簿对象而不是工作簿.names集合调用.load():

await Excel.run<void>(async context => {
    context.workbook.load('names');
    await context.sync();

    context.workbook.names.items.at(0)?.delete();
  });

OfficeMockObject似乎还不支持集合,这意味着未将load方法添加到您提供的names数组中。建议的服务代码可解决该限制。

相关问题