Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 茉莉花模拟窗口对象_Javascript_Mocking_Jasmine - Fatal编程技术网

Javascript 茉莉花模拟窗口对象

Javascript 茉莉花模拟窗口对象,javascript,mocking,jasmine,Javascript,Mocking,Jasmine,如何模拟窗口对象?我正在做firefox扩展,我想使用jasmine进行javascript测试 在我的javascript中,我有 function submit() { ... var url = window.arguments[0]; ... } 显然,我必须在jasmine中模拟window.arguments[0],因为如果不从window.openDialog传递任何参数,该对象就不存在 这是我试图用“with”来嘲弄它 但我仍然得到以下错误类型错误:无法读取undefined

如何模拟窗口对象?我正在做firefox扩展,我想使用jasmine进行javascript测试

在我的javascript中,我有


function submit() {
...
var url = window.arguments[0];
...
}
显然,我必须在jasmine中模拟window.arguments[0],因为如果不从window.openDialog传递任何参数,该对象就不存在

这是我试图用“with”来嘲弄它

但我仍然得到以下错误类型错误:无法读取undefined的属性“0”,就像在运行测试窗口时一样。参数[0]会随着实际窗口而消失,因为如果我这样做


window.arguments[0]


在测试内部,它打印出“http://localhost“没错。但是当涉及submit()方法时,它会显示一个错误,即window.argument未定义

问题在于您只是覆盖了窗口对象的属性。如果你能做到这一点,浏览器也能做到。因此,模拟每个人都可以访问的全局对象的函数或属性通常不是一个好主意,因为当您尝试访问它们时,您永远无法确定您的更改是否存在

这让我想到了。使代码单元可测试是一种常见的模式,重点是单元。这是什么意思。创建新对象或访问全局对象时,不仅要测试单元功能,还要测试新创建或全局对象的功能。为此,您不需要在单元中创建新对象,而是将它们传递到。通常情况下,您会在构造函数中实现这一点,但正如在JavaScript函数中,函数体是构造函数的对象一样,您也可以将依赖项简单地传递到函数中

因此,在您的例子中,函数依赖于全局窗口对象。因此,与其尝试访问全局窗口对象,不如将其作为参数传递到函数中。通过这种方式,您可以将生产代码中的窗口对象和带有参数atribute的简单JavaScript对象传递到测试中:

function youWannaTest(w){
    console.log(w.arguments[0]);
}
在分机中,调用如下函数:

youWannaTest(window);
youWannaTest({arguments: ['someValue']});
在测试中,按如下方式调用函数:

youWannaTest(window);
youWannaTest({arguments: ['someValue']});

我还认为依赖注入是最干净的解决方案

你的JS:

function submit(_window) {
    _window = _window || window
    ...
    var url = _window.arguments[0];
    ...
}
您的单元测试:

it('works like a dream', function () {
    var _window = { arguments: ['url'] }
    expect(submit(_window)).toBeTotallyAwesome()
})

是的,您可以模拟窗口对象

您必须做的第一件事是在JS代码中做一个更改:将窗口替换为$window

然后,您可以使用以下代码模拟窗口:

var window = {
  arguments : ['url']
};
现在在等级库文件中:在每个块之前

$controller('controllerName', {$window : window});

谢谢你的回复,所以我不能模拟它?这只与角度相关的用例相关。