伊夫下面的代码使用按预期工作的本地存储,我想为它创建单元测试的问题是,我在这个功能使用本地存储模拟本地存储/覆盖
这是我想测试
open: function(url) {
var that = this;
if (!localStorage.getItem(“alert”)) {
that_run(url)
.then(function(isBlocked) {
if (isBlocked) {
that._notify();
localStorage.setItem(“alert”, true);
} else {
localStorage.setItem(“alert”, true);
that._exe(“page”,url)
}
}).done();
} else {
that._exe(“page”,url)
}
},
这是正在测试的功能,但我想重写窗口是不好的做法,我的问题,如果我能写这个测试最好?
it.only("test for open", function () {
var url = "http://mytesturl”;
winlocalStorage.getItem = function(){
return false;
};
var oSimulateSpy = sandbox.spy(exc "_simulate");
return orun.open(url).then(function(){
expect(oSimulateSpy.called).to.be.true;
});
});
我看到了这篇文章,这个使用功能的编程 https://stackoverflow.com/a/20153543/6124024 但我认为通过本地存储的参数是在这种情况下有点大材小用,因为该功能(开)从许多地方调用多次。 ..有没有更好的/更清洁的方式来处理这个问题?
对此答案的建议是正确的做法。您可以像Stuart建议的那样对其进行破解,但这是一种破解,它要求您的测试对实现细节有深入的了解。如果你传递了一个可以被stubbed的对象,它就是你的API的一部分。 –
@JuanMendes - 抱歉,我想念这个评论:)好吧,这是要走的路,你也认为使用这里功能的解决方案是矫枉过正? –
我不确定你的意思是“认为在这里使用功能性解决方案是过度杀伤性的”我也无法理解你的问题,我只看到一种方法被使用,它似乎与函数式编程没有关系。我也不知道函数编程和覆盖有什么关系。无论如何,我可以告诉你,你发布的答案中提出的解决方案是实现它的标准方法,如果你认为你的代码必须经过测试,那么不会被视为矫枉过正。你可以走得更远,并使用依赖注入框架,但这超出了你的问题。 –