JavaScript如何模拟确认方法

时间:2010-02-16 17:09:04

标签: javascript

我的JavaScript代码中包含以下代码。

if (window.confirm('Are you sure?')) {
    AdminData.actOnResult('delete');
}

我正在为这段代码编写测试。我如何模拟window.confirm方法?我试过跟随代码,但它没有用。

window.confirm = function(arg) {
    return true;
};

我可以将window.confirm方法移动到另一个函数然后我可以模拟该方法。但是我想知道是否有更好的解决方案。

3 个答案:

答案 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');   
}