如何为 jQuery on() 方法编写 Jasmine 测试用例
How to write Jasmine test cases for jQuery on() method
我是 Jasmine 的新手。如果有人可以向我介绍如何为以下 jquery 代码编写测试用例,我将不胜感激:
$(document).on('startViewDetail', function(event, transactionId) {
$(document).trigger('ClearMessages', [{
containerName: 'EnterDetails'
}]);
logger.debug('view transaction detail started');
startViewTransaction(transactionId);
});
var startViewTransaction = function(transactionId){...}
感谢期待!
上述代码的 Jasmine 测试用例:
describe('Working with transaction details component', function() {
beforeEach(function() {
spyOnEvent(document, 'startViewDetail');
$(document).trigger('startViewDetail', mockDataObject.transactionId);
});
it('test startViewTransaction', function() {
spyOn(document, 'startViewTransaction').and.callFake(function(e) {
console.log("This is a spy call for startViewTransaction");
});
expect(document.startViewTransaction).toHaveBeenCalled();
expect(document.startViewTransaction).toHaveBeenCalledWith(mockDataObject.transactionId);
});
});
这个 post 的范围很广,所以我将从一种方法开始
因此,在您要对代码进行单元测试之前,您需要了解一些问题
- 您是在测试代码的功能还是事件绑定的功能
- 如果是测试事件绑定,恐怕jQuery已经对它进行了彻底的单元测试
我个人觉得没有必要测试jQuery方法。这只是转移了测试实际手写代码的目的。话虽如此,这是我根据您的代码准备的示例测试。
$(document).on('startViewDetail', function(event, transactionId) {
$(document).trigger('ClearMessages', [{
containerName: 'EnterDetails'
}]);
console.log('view transaction detail started');
startViewTransaction(transactionId);
});
var startViewTransaction = function(transactionId) {
console.log('started transaction with transactionId: ' + transactionId);
}
describe('sample test', function() {
it('test startViewTransaction', function() {
spyOn(window, 'startViewTransaction').and.callFake(function(e) {
console.log("This is a spy call for startViewTransaction");
});
var obj = $(document);
obj.trigger('startViewDetail', 1);
expect(window.startViewTransaction).toHaveBeenCalled();
expect(window.startViewTransaction).toHaveBeenCalledWith(1);
})
});
编辑:
回复评论:
- startViewDetail 不是一个方法,它是一个事件名称,所以你的
spyOnEvent(document, 'startViewDetail');
行是无效的。删除它,因为它没有任何作用。
- 我想知道你为什么要监视
document
对象,javascript 的 stray/stand-alone 函数总是在 window 下。所以把你的间谍换成反对 window 而不是 document.
- 你不应该在 beforeEach 中使用这一行
$(document).trigger('startViewDetail', mockDataObject.transactionId);
,这应该像我上面使用的那样在你的测试中使用。
spyOn(document, 'startViewTransaction').and.callFake(function(e) {
console.log("This is a spy call for startViewTransaction");
});
也需要修改,它应该违背 window 对象而不是文档。
expect(document.startViewTransaction).toHaveBeenCalled();
expect(document.startViewTransaction).toHaveBeenCalledWith(mockDataObject.transactionId);
也是如此
- Jasmine documentation 是了解 beforeEach、it、afterEach 块如何工作的最佳来源。
我是 Jasmine 的新手。如果有人可以向我介绍如何为以下 jquery 代码编写测试用例,我将不胜感激:
$(document).on('startViewDetail', function(event, transactionId) {
$(document).trigger('ClearMessages', [{
containerName: 'EnterDetails'
}]);
logger.debug('view transaction detail started');
startViewTransaction(transactionId);
});
var startViewTransaction = function(transactionId){...}
感谢期待!
上述代码的 Jasmine 测试用例:
describe('Working with transaction details component', function() {
beforeEach(function() {
spyOnEvent(document, 'startViewDetail');
$(document).trigger('startViewDetail', mockDataObject.transactionId);
});
it('test startViewTransaction', function() {
spyOn(document, 'startViewTransaction').and.callFake(function(e) {
console.log("This is a spy call for startViewTransaction");
});
expect(document.startViewTransaction).toHaveBeenCalled();
expect(document.startViewTransaction).toHaveBeenCalledWith(mockDataObject.transactionId);
});
});
这个 post 的范围很广,所以我将从一种方法开始
因此,在您要对代码进行单元测试之前,您需要了解一些问题
- 您是在测试代码的功能还是事件绑定的功能
- 如果是测试事件绑定,恐怕jQuery已经对它进行了彻底的单元测试
我个人觉得没有必要测试jQuery方法。这只是转移了测试实际手写代码的目的。话虽如此,这是我根据您的代码准备的示例测试。
$(document).on('startViewDetail', function(event, transactionId) {
$(document).trigger('ClearMessages', [{
containerName: 'EnterDetails'
}]);
console.log('view transaction detail started');
startViewTransaction(transactionId);
});
var startViewTransaction = function(transactionId) {
console.log('started transaction with transactionId: ' + transactionId);
}
describe('sample test', function() {
it('test startViewTransaction', function() {
spyOn(window, 'startViewTransaction').and.callFake(function(e) {
console.log("This is a spy call for startViewTransaction");
});
var obj = $(document);
obj.trigger('startViewDetail', 1);
expect(window.startViewTransaction).toHaveBeenCalled();
expect(window.startViewTransaction).toHaveBeenCalledWith(1);
})
});
编辑: 回复评论:
- startViewDetail 不是一个方法,它是一个事件名称,所以你的
spyOnEvent(document, 'startViewDetail');
行是无效的。删除它,因为它没有任何作用。 - 我想知道你为什么要监视
document
对象,javascript 的 stray/stand-alone 函数总是在 window 下。所以把你的间谍换成反对 window 而不是 document. - 你不应该在 beforeEach 中使用这一行
$(document).trigger('startViewDetail', mockDataObject.transactionId);
,这应该像我上面使用的那样在你的测试中使用。 spyOn(document, 'startViewTransaction').and.callFake(function(e) { console.log("This is a spy call for startViewTransaction"); });
也需要修改,它应该违背 window 对象而不是文档。expect(document.startViewTransaction).toHaveBeenCalled(); expect(document.startViewTransaction).toHaveBeenCalledWith(mockDataObject.transactionId);
也是如此- Jasmine documentation 是了解 beforeEach、it、afterEach 块如何工作的最佳来源。