Javascript 用梦魇ejs模拟内置对象

Javascript 用梦魇ejs模拟内置对象,javascript,testing,mocking,electron,nightmare,Javascript,Testing,Mocking,Electron,Nightmare,我正在尝试使用噩梦EJS加载一个页面,单击一个按钮,然后截图进行测试。按钮上的单击处理程序请求地理位置。这是我测试的一部分。如果用户授予地理定位权限,我希望页面以某种方式显示,如果用户拒绝,则以另一种方式显示 问题是噩梦并没有为我提供一个方法来截获权限提示以接受或拒绝它。经过一些研究,我了解到Electron只是硬编码了这个“授权”的许可,所以甚至没有办法将其设置为“拒绝” 我想做的是将Electron的navigator.geolocation对象替换为以某种方式响应geolocation请求

我正在尝试使用噩梦EJS加载一个页面,单击一个按钮,然后截图进行测试。按钮上的单击处理程序请求地理位置。这是我测试的一部分。如果用户授予地理定位权限,我希望页面以某种方式显示,如果用户拒绝,则以另一种方式显示

问题是噩梦并没有为我提供一个方法来截获权限提示以接受或拒绝它。经过一些研究,我了解到Electron只是硬编码了这个“授权”的许可,所以甚至没有办法将其设置为“拒绝”

我想做的是将Electron的
navigator.geolocation
对象替换为以某种方式响应geolocation请求的mock

new Nightmare().goto('https://example.com')
    .evaluate(function () {
        navigator.geolocation = {
            getCurrentPosition(cb) {
                cb({coords: latitude: 42, longitude: -42});
            }
        }
    })
    .click('#locateMe')
    .screenshot()
    .end()
    .then(diffScreenshot)
但是,当我尝试此操作时,navigator.geolocation对象似乎没有改变。是否有其他方法可以实现此目标?

我认为这在两个项目中都是可能的(或应该的),您可以尝试更改:

navigator.geolocation

这是因为大多数evaluate调用都是在干净的上下文中运行的,或者我认为是这样。如果这不起作用,那么纳瓦利亚可能可以做到,因为它可以说是相当“裸金属”


祝你好运

使用window.navigator似乎奏效了!谢谢
window.navigator.geolocation