2016-06-26 1 views
0

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)?

Antwort

2

Sie ist nicht definiert, da sie sich nicht im Testfunktionsbereich befindet. Definieren Sie es im beschreibenden Bereich einen Schritt vorher. Sehen Sie sich dazu die Angular-Dokumentation an. https://docs.angularjs.org/guide/unit-testing

describe("BinarySearchTree insert function", function() { 
    var binarySearchTree; 
    beforeEach(function() { 
    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); 
    }); 

}); 
+0

Vielen Dank, Sohaib. Und danke für die Referenz. – Kwhitejr

1

Der Grund, warum Sie binarySearchTree bekommen ist undefined bereits erklärt.

Ich möchte über beforeEach und afterEach Funktionen sprechen.

In beforeEach Funktion, die wir tun, im Allgemeinen grundlegende Setup für Test Dinge wie Variablen Initialisierung usw. externe Anrufe Ausdrücken

und ‚afterEach‘ Methode wie destroy Funktionen arbeitet, wo im Allgemeinen Speicherfreigaben Sachen, die wir schreiben.

Verwandte Themen