为了能够测试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");
这有可能吗? This suggests不是,但对于JXA,我想知道是否还有其他技术。