我在javascript中创建了一个二叉树类,但我的测试失败但我没有看到我的方法有任何问题,而且我没有收到任何差异。任何见解都会很棒。
这是我的班级:
def self.enqueue(updatable:, action:)
DelayedSync.create(updatable: updatable, status: :queued, action: action)
rescue ActiveRecord::RecordNotUnique
queued_update = DelayedSync.find_by(updatable: updatable, status: :queued, action: :sync_update)
if action == :sync_delete && queued_update.present?
queued_update.sync_delete!
else
Rails.logger.debug "#{updatable.class.name} #{updatable.id} already queued for sync, skipping."
end
end
这是我的测试:
function binaryTree() {
this.root = null;
};
binaryTree.prototype = {
constructor: binaryTree,
add: function(val) {
var root = this.root;
if(!root) {
this.root = new Node(val);
return;
}
var currentNode = root;
var newNode = new Node(val);
while(currentNode) {
if(val < currentNode.value) {
if(!currentNode.left) {
currentNode.left = newNode;
break;
}
else {
currentNode = currentNode.left;
}
}
else {
if(!currentNode.right) {
currentNode.right = newNode;
break;
}
else {
currentNode = currentNode.right;
}
}
}
}
这是我得到的错误:
it('adds values to the binary tree', function () {
var test = new binaryTree();
test.add(7);
test.add(43);
test.add(13);
test.add(27);
test.add(82);
test.add(2);
test.add(19);
test.add(8);
test.add(1);
test.add(92);
expect(test).to.equal({
root:
{ value: 7,
left:
{ value: 2,
left: { value: 1, left: null, right: null },
right: null },
right:
{ value: 43,
left:
{ value: 13,
left: { value: 8, left: null, right: null },
right:
{ value: 27,
left: { value: 19, left: null, right: null },
right: null } },
right:
{ value: 82,
left: null,
right: { value: 92, left: null, right: null } } } }
});
});
如果我弄乱测试对象中的值,我会看到差异出现,所以它看起来像是一切都是平等的,我很难过。如果我能得到第二双眼睛,我真的很感激。
答案 0 :(得分:1)
您正在使用Mocha的to.equal
期望值,但这会测试严格的相等性。 http://chaijs.com/api/bdd/#method_equal
两个对象,即使它们具有所有相同的键值对,也不会返回true到三等于(===)比较器。这是因为它们实际上是存储在内存中的两个独立对象,看起来很相似。
改为使用to.deep.equal
!
有意义吗?
答案 1 :(得分:0)
如果遇到任何人,我发现了这个问题。即使所有属性都相同,在JavaScript中也无法完美地比较两个对象。 This post有两种解决此限制的方法,其中一种方法在这种情况下很容易实现:
将expect(test).to.equal({
更改为expect(JSON.stringify(test)).to.equal(JSON.stringify({
将允许此测试通过。对对象进行字符串化是比较两个对象的一种非常简单的方法,但这只有在属性完全相同的情况下才有效。