OfficeDev / OfficeDev/Office-Addin-Scripts
OfficeMockObject cannot mock NamedItemCollection
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 194
- Forks
- 117
- Avg merge
- 1d 32m
- Merged PRs (30d)
- 2
Description
Prerequisites
Please answer the following questions before submitting an issue.
YOU MAY DELETE THE PREREQUISITES SECTION.
- I am running the latest version of Node and the tools
- I checked the documentation and found no answer
- I checked to make sure that this issue has not already been filed
Expected behavior
Please describe the behavior you were expecting
I am trying to mock Named ranges array of excel so i can run some tests on adding and removing custom ranges, but it appears that the mock object is not equipped to handle arrays?
Using Jest and in Angular.
As per the documentation i am mocking the Host object and assigning it to the 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);
});
});
Then in my service
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();
});
}
The line mentioned above produces the following error
Cannot convert undefined or null to object
TypeError: Cannot convert undefined or null to object
at Function.keys (<anonymous>)
Changing the code slightly to instead use context.load(workbook.names, 'items') produces a different error
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)
Also trying workbook.names.load('items') works but items is undefined even though it was clearly defined in the mock object.
All of the ways tested above work when the code is run properly within an office environment and only fail with mocking.
The only workaround that worked was:
context.workbook.load('names')
Expected behaviour
I would expect any code that runs fine when not under test to work with the mock object as well.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in src/officeMockObject.ts around load and parseObjectPropertyIntoArray, especially the reported lines 41, 148, and 168, and reproduce the Jest case with workbook.names.items. Compare the supported load paths for NamedItemCollection and verify that the mock retains the supplied items and supports the operations shown in the issue without the reported errors.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- angular, typescript
- Domain
- testing-qa, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100