Для того, чтобы иметь возможность тестировать JXA-скрипты, я хотел бы имитировать вызовы JXA. Следующий код позволяет мне создать часть желаемой функциональности.
const mockMusicObject = songs => {
const jxaSongs = songs.map(
song =>
new Proxy(song, {
get(target, propKey) {
if (!Object.keys(song).includes(propKey)) {
return;
}
return (...args) => target[propKey];
}
})
);
global.Application = () => ({ selection: () => jxaSongs });
};
const songs = [{ artist: "Artist 1", name: "Name 1" }];
mockMusicObject(songs);
Проблема в том, что в объекте Proxy невозможно определить, какие вызовы являются вызовами методов и свойствами.
Кажется, что возможна только одна из следующих опций (поскольку свойство artist
неотличимо от метода):
const music = Application("Music");
music.selection()[0].artist();
const music = Application("Music");
music.selection()[0].artist.set("New Artist");
Это вообще возможно? Это говорит о том, что это не так, но для JXA мне интересно, есть ли другие методы.