javascript + mocha:可能是在 for 循环内声明的函数的闭包问题
javascript + mocha: probably a closure issue with functions declared inside a for loop
为了学习 javascript,我用它实现并测试了经典算法。
这是我尝试实现二进制搜索并对其进行测试的尝试:
var assert = require('assert')
function binsearch (xs, v) {
if (xs === undefined || xs.length === 0) { return null }
var lo = 0
var hi = xs.length - 1
while (lo <= hi) {
var i = (lo + hi) / 2 | 0
if (xs[i] === v) {
return i
} else if (v < xs[i]) {
hi = i - 1
} else if (v > xs[i]) {
lo = i + 1
}
}
return null
}
var check_bsearch = function (bsearch, xs, x, i) {
it(bsearch.name + ' [' + xs + '] ' + x + ' ' + i, function () {
assert.equal(bsearch(xs, x), i)
})
}
describe('Test binsearch', function () {
describe('on a sorted array', function() {
var xs = []
for (var i = 0; i < 2; ++i) {
xs[i] = 2 * i
for (var j = 0; j <= i; ++j) {
check_bsearch(binsearch, xs, 2 * j, j)
check_bsearch(binsearch, xs, 2 * j + 1, null)
check_bsearch(binsearch, xs, -1, null)
check_bsearch(binsearch, xs, -2, null)
check_bsearch(binsearch, xs, 2 * i + 1, null)
check_bsearch(binsearch, xs, 2 * i + 2, null)
}
}
})
})
为了重现我要说的内容,将上面的代码复制到某个 bsearch.js
文件中,安装 mocha.js
类似 sudo npm install -g mocha
的东西,最后安装 运行文件:mocha bsearch.js
一项测试应该失败:具有 xs = [0], x = 2
且预期结果为 null
的测试。如果您单独重新创建此测试,它将通过。
我怀疑这是一个关闭问题。您可能已经注意到我已经在使用辅助函数 check_bsearch
来获得预期的闭包环境。但是,我显然遗漏了一些东西。我该如何修复测试?
数组通过引用传递。发生的情况是,当您循环修改传递给函数的 xs
数组时,当测试实际 运行 时,它们都获得相同的值。您应该复制该数组,以便每个测试在调用时获得其值的快照。它可以很简单:
var check_bsearch = function (bsearch, xs, x, i) {
xs = xs.slice(); // Make a private copy of xs.
为了学习 javascript,我用它实现并测试了经典算法。
这是我尝试实现二进制搜索并对其进行测试的尝试:
var assert = require('assert')
function binsearch (xs, v) {
if (xs === undefined || xs.length === 0) { return null }
var lo = 0
var hi = xs.length - 1
while (lo <= hi) {
var i = (lo + hi) / 2 | 0
if (xs[i] === v) {
return i
} else if (v < xs[i]) {
hi = i - 1
} else if (v > xs[i]) {
lo = i + 1
}
}
return null
}
var check_bsearch = function (bsearch, xs, x, i) {
it(bsearch.name + ' [' + xs + '] ' + x + ' ' + i, function () {
assert.equal(bsearch(xs, x), i)
})
}
describe('Test binsearch', function () {
describe('on a sorted array', function() {
var xs = []
for (var i = 0; i < 2; ++i) {
xs[i] = 2 * i
for (var j = 0; j <= i; ++j) {
check_bsearch(binsearch, xs, 2 * j, j)
check_bsearch(binsearch, xs, 2 * j + 1, null)
check_bsearch(binsearch, xs, -1, null)
check_bsearch(binsearch, xs, -2, null)
check_bsearch(binsearch, xs, 2 * i + 1, null)
check_bsearch(binsearch, xs, 2 * i + 2, null)
}
}
})
})
为了重现我要说的内容,将上面的代码复制到某个 bsearch.js
文件中,安装 mocha.js
类似 sudo npm install -g mocha
的东西,最后安装 运行文件:mocha bsearch.js
一项测试应该失败:具有 xs = [0], x = 2
且预期结果为 null
的测试。如果您单独重新创建此测试,它将通过。
我怀疑这是一个关闭问题。您可能已经注意到我已经在使用辅助函数 check_bsearch
来获得预期的闭包环境。但是,我显然遗漏了一些东西。我该如何修复测试?
数组通过引用传递。发生的情况是,当您循环修改传递给函数的 xs
数组时,当测试实际 运行 时,它们都获得相同的值。您应该复制该数组,以便每个测试在调用时获得其值的快照。它可以很简单:
var check_bsearch = function (bsearch, xs, x, i) {
xs = xs.slice(); // Make a private copy of xs.