我试图模拟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种方法一起工作,就像在正常的插件环境中一样。
有什么建议吗?
1条答案
按热度按时间q9rjltbz1#
尝试将服务代码更改为对工作簿对象而不是工作簿.names集合调用.load():
OfficeMockObject似乎还不支持集合,这意味着未将load方法添加到您提供的names数组中。建议的服务代码可解决该限制。