Ich möchte Mocha/Chai verwenden, um Code im Zusammenhang mit binären Suchbäumen zu testen. Hier teste ich die öffentliche insert
Methode. Ich möchte beforeEach()
und/oder afterEach()
Hooks verwenden, um die Testumgebung vor jeder it()
Anweisung zurückzusetzen, so dass ich die Grundlagen nicht vollständig wiederholen muss. Ich bekomme jedoch immer wieder verschiedene Fehler.Grundlegende aber ordnungsgemäße Verwendung von beforeEach() oder afterEach() mit mocha.js und chai.js
Spec
describe("BinarySearchTree insert function", function() {
beforeEach(function() {
var binarySearchTree = new BinarySearchTree();
binarySearchTree.insert(5);
});
it("creates a root node with value equal to the first inserted value", function() {
expect(binarySearchTree.root.value).to.equal(5);
});
it("has a size equal to the amount of inserted values", function() {
binarySearchTree.insert(3);
expect(binarySearchTree.size).to.equal(2);
});
it("returns an error for non-unique values", function() {
binarySearchTree.insert(3);
expect(binarySearchTree.insert(3)).to.throw(String);
});
it("if inserted value is larger than current node, make or descend to rightChild", function() {
binarySearchTree.insert(3);
binarySearchTree.insert(10);
binarySearchTree.insert(7);
expect(binarySearchTree.root.rightChild.value).to.equal(10);
});
});
Fehler: ReferenceError: binarySearchTree is not defined
In Wahrheit, ich Irrtum vorbehalten, bevor es keine afterEach()
die Testumgebung zurückzusetzen, nicht weil binarySearchTree
nicht definiert ist. Ich möchte das, wenn überhaupt möglich, nur mit Mocha und Chai (und nicht mit anderen Paketen wie Sinon usw.) erreichen.
getesteten Code
exports.Node = Node;
function Node(value) {
this.value = value;
this.leftChild = null;
this.rightChild = null;
}
exports.BinarySearchTree = BinarySearchTree;
function BinarySearchTree() {
this.root = null;
this.size = 0;
}
BinarySearchTree.prototype.insert = function(value) {
// 1) when root node is already instantiated
if (this.root === null) {
// tree is empty
this.root = new Node(value);
this.size++;
} else {
// 2) nodes are already inserted
var findAndInsert = function (currentNode) {
if (value === currentNode.value) {
throw new Error('must be a unique value');
}
// base case
if (value > currentNode.value) {
// belongs in rightChild
if (currentNode.rightChild === null) {
currentNode.rightChild = new Node(value);
} else {
findAndInsert(currentNode.rightChild);
}
} else if (value < currentNode.value) {
// belongs in leftChild
if (currentNode.leftChild === null) {
currentNode.leftChild = new Node(value);
} else {
findAndInsert(currentNode.leftChild);
}
}
};
findAndInsert(this.root);
this.size++;
}
};
Bonus Frage ... Ich bin nicht sicher, ob ich richtig für die geworfenen Fehler testen bin (wenn ein nicht-eindeutiger Wert eingeführt wird)?
Vielen Dank, Sohaib. Und danke für die Referenz. – Kwhitejr