程式狂想筆記

一個攻城師奮鬥史

0%

用Qunit驗證身份證

最近copy到公司身份證驗證程式有問題
好險是上線前發現
今天就簡單用測試程式寫了QUNIT測試程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<!DOCTYPE html>
<html>
<head>
<link href="https://code.jquery.com/qunit/qunit-git.css" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/qunit/qunit-git.js"></script>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

<script>


QUnit.module('測試身份證');

function getTwID(){
//建立字母分數陣列(A~Z)
var city = new Array(
1,10,19,28,37,46,55,64,39,73,82, 2,11,
20,48,29,38,47,56,65,74,83,21, 3,12,30
)
//建立隨機身份證碼
var id = new Array();
id[0] = String.fromCharCode(Math.floor(Math.random() * (26)) + 65);
id[1] = Math.floor(Math.random() * (2)) + 1;
for(var i=2; i<9; i++){
id[i] = Math.floor(Math.random() * (9)) + 0;
}
//計算總分
var total = city[id[0].charCodeAt(0)-65];
for(var i=1; i<=8; i++){
total += eval(id[i]) * (9 - i);
}
//計算最尾碼
var total_arr = (total+'').split('');
var lastChar = eval(10-total_arr[total_arr.length-1]);
var lastChar_arr = (lastChar+'').split('');
//補上最後檢查碼
id[id.length++] = lastChar_arr[lastChar_arr.length-1];
//回傳結果
return id.join('');
}

function checkTwID(id){
//建立字母分數陣列(A~Z)
var city = new Array(
1,10,19,28,37,46,55,64,39,73,82, 2,11,
20,48,29,38,47,56,65,74,83,21, 3,12,30
)
id = id.toUpperCase();
// 使用「正規表達式」檢驗格式
if (id.search(/^[A-Z](1|2)\d{8}$/i) == -1) {
alert('基本格式錯誤');
return false;
} else {
//將字串分割為陣列(IE必需這麼做才不會出錯)
id = id.split('');
//計算總分
var total = city[id[0].charCodeAt(0)-65];
for(var i=1; i<=8; i++){
total += eval(id[i]) * (9 - i);
}
//補上檢查碼(最後一碼)
total += eval(id[9]);
//檢查比對碼(餘數應為0);
return ((total%10 == 0 ));
}
}

var chartId_list = [];

for(var i = 0; i < 1000;i++){
chartId_list.push(getTwID());
}
//遇到動態產生錯誤問題,解決方法
//http://stackoverflow.com/questions/36021953/qunit-test-in-loop-index-always-the-same
for(let i = 0; i < 1000; i++){
QUnit.test( "驗證ID:" + chartId_list[i], function( assert ) {
assert.ok( checkTwID(chartId_list[i]), " 網路方法 Passed!" );
});
}
</script>

#備忘錄
之前動態產生測試會有問題
有想用閉包解決,但沒有想到怎麼用 x.x
最後還是靠stackoverflow查到
果然我還需要磨練阿~~~~