Javascript Shift不正确返回数组JS中的第一个元素

Javascript Shift不正确返回数组JS中的第一个元素,javascript,unit-testing,Javascript,Unit Testing,我正在编写小类creatureTurnQueue,其中有方法“GetActiveBioter”。该方法应该返回数组中的第一个元素,但当我在creatureTurnQueueTest中运行单元测试时,我出现了错误,因为第一个元素与测试中的元素不同。但是这个元素应该是相同的。当我跳转到队列并用pop()检查最后一个元素是什么时,这段代码就起作用了 creatureTurnQueueTest.js import Board from '../board.js' import Point from '.

我正在编写小类creatureTurnQueue,其中有方法“GetActiveBioter”。该方法应该返回数组中的第一个元素,但当我在creatureTurnQueueTest中运行单元测试时,我出现了错误,因为第一个元素与测试中的元素不同。但是这个元素应该是相同的。当我跳转到队列并用pop()检查最后一个元素是什么时,这段代码就起作用了

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;
        }
    }
}
工作代码

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()
操作后,索引会出现问题。您要么一直调整预期的索引,要么做一些更可预测的事情。因为我甚至不知道你想做什么,所以很难说怎么处理。