我的JavaScript代码中包含以下代码。
if (window.confirm('Are you sure?')) {
AdminData.actOnResult('delete');
}
我正在为这段代码编写测试。我如何模拟window.confirm方法?我试过跟随代码,但它没有用。
window.confirm = function(arg) {
return true;
};
我可以将window.confirm方法移动到另一个函数然后我可以模拟该方法。但是我想知道是否有更好的解决方案。
答案 0 :(得分:3)
我正在使用Jasmine进行单元测试,并嘲笑警告并通过以下方式确认
alert = function (alertString) {debug.log('ALERT:', alertString);};
var confirmValue = true; //set this before you expect the confirm statement to be shown
confirm = function (confirmString) {
debug.log('CONFIRM:', confirmString, confirmValue);
return confirmValue;
};
然后我可以说:
describe("test", function () {
it('should test true confirm workflow', function () {
confirmValue = true; // or false if you like
//expect outcomes that would come from any confirms being called with true
});
});
这并不完美,如果您在设置confirmValue之间有多次确认,则可能会遇到麻烦。也许那时设置预期确认返回值的提示会很好......很棘手......
答案 1 :(得分:1)
你自己的代码在IE中适合我。只是全局范围中的以下 应该覆盖它:
var confirm = function () { return true; }
修改强>
我曾经在SO上看过几个关于试图覆盖confirm
的问题,主要是因为他们不喜欢它(以及谁会这样做)。如果您因为这种原因试图绕过它,我建议您考虑更改代码以实现基于回调的替换以进行确认。看看jQuery UI's modal confirm就是一个很好的例子。
答案 2 :(得分:1)
我考虑在窗口(或其他)对象上实现静态方法的包装器。然后将您的包装器提供给静态方法的任何使用。显然,如果您使用基于“类”的实现,这会更容易。然后,为了模拟方法,只需提供一个返回所需值的不同包装器。
var windowWrapper = {
confirm: function(msg) { return confirm(msg); },
...
};
var mockWrapper = {
confirm: function(msg) { return true; },
...
}
var wrapper = windowWrapper;
if (test) {
wrapper = mockWrapper;
}
...
if (wrapper.confirm('Are you sure?')) {
AdminData.actOnResult('delete');
}