2010-02-16 30 views
8

Tôi có mã sau trong mã JavaScript của mình.JavaScript cách mô phỏng phương thức xác nhận

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

Tôi đang viết kiểm tra đoạn mã này. Làm cách nào để thử phương thức window.confirm? Tôi đã thử mã sau nhưng nó không hoạt động.

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

Tôi có thể di chuyển phương thức window.confirm sang một chức năng khác và sau đó tôi có thể thử phương pháp đó. Tuy nhiên tôi đã tự hỏi nếu có một giải pháp tốt hơn.

Trả lời

1

Mã của riêng bạn hoạt động tốt cho tôi trong IE. Chỉ cần sau trong phạm vi toàn cầu nên ghi đè nó:

var confirm = function() { return true; } 

EDIT
Tôi đã nhìn thấy một vài câu hỏi về SO trong quá khứ về việc cố gắng để ghi đè confirm, chủ yếu là bởi vì họ không thích nó (và ai sẽ?). Nếu bạn đang cố gắng bỏ qua nó vì lý do này, tôi khuyên bạn nên xem xét việc thay đổi mã của mình để thực hiện thay thế dựa trên cuộc gọi lại để xác nhận. Hãy xem jQuery UI's modal confirm để có một ví dụ điển hình về điều này.

1

Tôi muốn suy nghĩ về việc triển khai trình bao bọc xung quanh các phương pháp tĩnh trên đối tượng cửa sổ (hoặc đối tượng khác). Sau đó cung cấp wrapper của bạn cho bất cứ điều gì sử dụng phương pháp tĩnh. Rõ ràng điều này là dễ dàng hơn nếu bạn đang sử dụng một "lớp" dựa trên thực hiện. Sau đó, để giả lập phương thức, chỉ cần cung cấp một trình bao bọc khác trả về giá trị mà bạn muốn.

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

Tôi đang sử dụng Jasmine cho kiểm tra đơn vị và đã chế giễu cảnh báo và xác nhận như sau

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; 
}; 

Sau đó, tôi có thể nói:

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 
    }); 
}); 

Nó không hoàn hảo, và tôi f bạn có nhiều xác nhận có thể bật giữa cài đặt confirmValue đó, bạn có thể gặp sự cố. Có lẽ sau đó nó sẽ là tốt để thiết lập một gợi ý xác định giá trị trả lại ... khéo léo ...

+0

IMO của 3 câu trả lời cho đến nay, một trong những địa chỉ những gì Nick đang yêu cầu. Có rất ít trên Stackoverflow ngày hôm nay về tĩnh mocking trong Javascript bên cạnh câu trả lời của bạn. –

Các vấn đề liên quan