Javascript Shift不正确返回数组JS中的第一个元素
我正在编写小类creatureTurnQueue,其中有方法“GetActiveBioter”。该方法应该返回数组中的第一个元素,但当我在creatureTurnQueueTest中运行单元测试时,我出现了错误,因为第一个元素与测试中的元素不同。但是这个元素应该是相同的。当我跳转到队列并用pop()检查最后一个元素是什么时,这段代码就起作用了 creatureTurnQueueTest.jsJavascript Shift不正确返回数组JS中的第一个元素,javascript,unit-testing,Javascript,Unit Testing,我正在编写小类creatureTurnQueue,其中有方法“GetActiveBioter”。该方法应该返回数组中的第一个元素,但当我在creatureTurnQueueTest中运行单元测试时,我出现了错误,因为第一个元素与测试中的元素不同。但是这个元素应该是相同的。当我跳转到队列并用pop()检查最后一个元素是什么时,这段代码就起作用了 creatureTurnQueueTest.js import Board from '../board.js' import Point from '.
import Board from '../board.js'
import Point from '../point.js'
import Creature from '../creture.js'
import CreatureTurnQueue from '../creatureTurnQueue.js'
export default class CreatureTurnQueueTest {
queueShoulChangeActiveCreature() {
let creatureTurnQueue = new CreatureTurnQueue();
let creture1 = new Creature();
let creture2 = new Creature();
let creture3 = new Creature();
let creatureList = [];
let copyCreatureList = [];
creatureList.push(creture1)
creatureList.push(creture2)
creatureList.push(creture3)
copyCreatureList.push(creture1)
copyCreatureList.push(creture2)
copyCreatureList.push(creture3)
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
if (creatureList[0] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[1] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[2] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
}
}
import Board from '../board.js'
import Point from '../point.js'
import Creature from '../creture.js'
import CreatureTurnQueue from '../creatureTurnQueue.js'
export default class CreatureTurnQueueTest {
queueShoulChangeActiveCreature() {
let creatureTurnQueue = new CreatureTurnQueue();
let creture1 = new Creature();
let creture2 = new Creature();
let creture3 = new Creature();
let creatureList = [];
let copyCreatureList = [];
creatureList.push(creture1)
creatureList.push(creture2)
creatureList.push(creture3)
copyCreatureList.push(creture1)
copyCreatureList.push(creture2)
copyCreatureList.push(creture3)
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
if (creatureList[2] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[1] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[0] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
}
}
creatureTurnQueue.js
import Board from './board.js'
import Point from './point.js'
import Creature from './creture.js'
import CreatureTurnQueueTest from './test/creatureTurnQueueTest.js'
export default class CreatureTurnQueue {
constructor() {
this.creatureList = [];
this.copyCreatureList = [];
}
initQueue(list, copyList) {
console.log('inicjalizacja')
this.creatureList = list;
this.copyCreatureList = copyList;
}
getActiveCreature() {
return this.creatureList.shift();
}
next() {
console.log('this.creatureList.length', this.creatureList.length)
if (this.creatureList.length == 0) {
return true;
}
}
}
import Board from './board.js'
import Point from './point.js'
import Creature from './creture.js'
import CreatureTurnQueueTest from './test/creatureTurnQueueTest.js'
export default class CreatureTurnQueue {
constructor() {
this.creatureList = [];
this.copyCreatureList = [];
}
initQueue(list, copyList) {
console.log('inicjalizacja')
this.creatureList = list;
this.copyCreatureList = copyList;
}
getActiveCreature() {
return this.creatureList.pop();
}
next() {
console.log('this.creatureList.length', this.creatureList.length)
if (this.creatureList.length == 0) {
return true;
}
}
}
工作代码
creatureTurnQueueTest.js
import Board from '../board.js'
import Point from '../point.js'
import Creature from '../creture.js'
import CreatureTurnQueue from '../creatureTurnQueue.js'
export default class CreatureTurnQueueTest {
queueShoulChangeActiveCreature() {
let creatureTurnQueue = new CreatureTurnQueue();
let creture1 = new Creature();
let creture2 = new Creature();
let creture3 = new Creature();
let creatureList = [];
let copyCreatureList = [];
creatureList.push(creture1)
creatureList.push(creture2)
creatureList.push(creture3)
copyCreatureList.push(creture1)
copyCreatureList.push(creture2)
copyCreatureList.push(creture3)
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
if (creatureList[0] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[1] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[2] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
}
}
import Board from '../board.js'
import Point from '../point.js'
import Creature from '../creture.js'
import CreatureTurnQueue from '../creatureTurnQueue.js'
export default class CreatureTurnQueueTest {
queueShoulChangeActiveCreature() {
let creatureTurnQueue = new CreatureTurnQueue();
let creture1 = new Creature();
let creture2 = new Creature();
let creture3 = new Creature();
let creatureList = [];
let copyCreatureList = [];
creatureList.push(creture1)
creatureList.push(creture2)
creatureList.push(creture3)
copyCreatureList.push(creture1)
copyCreatureList.push(creture2)
copyCreatureList.push(creture3)
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
if (creatureList[2] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[1] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
if (creatureList[0] !== creatureTurnQueue.getActiveCreature()) {
throw `Exception: => Kolejka nie dziala poprawnie`
}
if (creatureTurnQueue.next()) {
creatureTurnQueue.initQueue(creatureList, copyCreatureList)
}
}
}
creatureTurnQueue.js
import Board from './board.js'
import Point from './point.js'
import Creature from './creture.js'
import CreatureTurnQueueTest from './test/creatureTurnQueueTest.js'
export default class CreatureTurnQueue {
constructor() {
this.creatureList = [];
this.copyCreatureList = [];
}
initQueue(list, copyList) {
console.log('inicjalizacja')
this.creatureList = list;
this.copyCreatureList = copyList;
}
getActiveCreature() {
return this.creatureList.shift();
}
next() {
console.log('this.creatureList.length', this.creatureList.length)
if (this.creatureList.length == 0) {
return true;
}
}
}
import Board from './board.js'
import Point from './point.js'
import Creature from './creture.js'
import CreatureTurnQueueTest from './test/creatureTurnQueueTest.js'
export default class CreatureTurnQueue {
constructor() {
this.creatureList = [];
this.copyCreatureList = [];
}
initQueue(list, copyList) {
console.log('inicjalizacja')
this.creatureList = list;
this.copyCreatureList = copyList;
}
getActiveCreature() {
return this.creatureList.pop();
}
next() {
console.log('this.creatureList.length', this.creatureList.length)
if (this.creatureList.length == 0) {
return true;
}
}
}
目前还不清楚测试失败的确切位置。但是,这可能是所有可能位置的常见原因-
shift()
在线修改数组。然而,您试图将数组中的索引项与.shift()
生成的内容进行比较。这很可能会打乱顺序和结果。例如,我建议检查creature1===creatureTurnQueue.getActiveBioter()
——使用对该生物的直接引用,而不是从数组中对其进行索引。谢谢你的建议。但这是一种循环测试的方法吗,因为现在我必须手动编写creature1,creature2。。。如果我必须检查100个生物呢?我不会为100个生物写测试。这是非常详尽的,很可能是不必要的。测试应该假设一些基本能力。如果您必须使用项目列表检查某些内容,通常您会检查第一项、第一项和第二项、最后一项,如果列表为空,可能会发生什么情况。因此,您尝试覆盖,以确保它与一个、多个一起工作,没有边界问题,并且列表为空也不例外。如果你期望列表失败,比如说,61个项目,你可能会包括一个特殊的测试,但更多的是一个滥杀。Ok 100 for test是滥杀,但这个代码将作为一个更大的应用程序的一部分使用,如果在真正的应用程序中,我需要检查100个生物怎么办?有没有一个循环的方法?那么我建议保留一份列表的副本或者别的什么。主要问题是,在您对元素执行shift()
操作后,索引会出现问题。您要么一直调整预期的索引,要么做一些更可预测的事情。因为我甚至不知道你想做什么,所以很难说怎么处理。