gpt4 book ai didi

javascript - Jasmine 模拟窗口对象

转载 作者:IT王子 更新时间:2023-10-29 03:07:00 26 4
gpt4 key购买 nike

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

在我的 javascript 中有


function submit() {
...
var url = window.arguments[0];
...
}

显然,我必须在 jasmine 中模拟 window.arguments[0],因为如果不从 window.openDialog 传递任何参数,则该对象不存在

这是我尝试用“with”来模拟它


it("should submit to server", function() {

var localContext = {
"window": {
arguments: ["http://localhost"]
}

}

with(localContext);

但我仍然收到此错误 TypeError: Cannot read property '0' of undefined,这就像测试运行时 window.arguments[0] 被真实窗口删除,因为如果我这样做了


窗口参数[0]

在测试中,它正确地打印出“http://localhost”。但是当涉及到 submit() 方法时,它显示 window.argument 未定义的错误。

最佳答案

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

这让我想到了 dependency injection .这是使您的代码可单元测试的常见模式,重点是单元。这是什么意思。当您创建一个新对象或访问一个全局对象时,您不仅在测试您的单元 功能,而且还在测试您新创建的对象或全局对象的功能。在此之前,您不是在单元 中创建新对象,而是将它们传入。通常您会在构造函数中执行此操作,但由于在 JavaScript 函数中是将函数主体作为构造函数的对象,因此您也可以将依赖项简单地传递到您的函数中。

因此在您的情况下,该函数取决于全局窗口对象。因此,与其尝试访问全局窗口对象,不如将其作为参数传递给您的函数。通过这种方式,您可以将生产代码中的 window 对象和一个带有参数属性的简单 JavaScript 对象传递到您的测试中:

function youWannaTest(w){
console.log(w.arguments[0]);
}

在你的扩展中调用这样的函数:

youWannaTest(window);

在你的测试中调用这样的函数:

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

关于javascript - Jasmine 模拟窗口对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com