在mocha.js和chai.js中基本但正确地使用beforeEach()或afterEach()

Basic but proper use of beforeEach() or afterEach() with mocha.js and chai.js

本文关键字:js beforeEach afterEach 正确地 mocha chai      更新时间:2023-09-26

我想使用mocha/chai测试与二叉搜索树相关的代码。在这里,我正在测试公共insert方法。我想使用beforeEach()和/或afterEach()钩子在每个it()语句之前重置测试环境,这样我就不必完全重复基础知识。然而,我不断得到各种错误。

规范

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);
  });
});

错误:ReferenceError: binarySearchTree is not defined

事实上,我期望在没有afterEach()重置测试环境之前出现错误,而不是因为没有定义binarySearchTree。如果可能的话,我希望只使用Mocha和Chai(而不是其他软件包,如Sinon等)来实现这一点。

测试代码
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++;
  }
};

奖金问题…我不确定我是否正确地测试抛出的错误(当插入非唯一值时)?

未定义,因为它不在测试函数范围内。在描述作用域之前一步定义它。参考Angular文档。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);
  });
});

您获得binarySearchTree的原因是undefined已经解释过了。

我想谈谈beforeEachafterEach函数。

beforeEach函数中,我们通常为测试做基本的设置,如变量初始化,存根外部调用等。

和'afterEach'方法像destroy函数一样工作,通常我们写内存释放的东西。