与椅子相关的错误消息:“AssertionError: expected undefined to deep equal

Chai-related error message: "AssertionError: expected undefined to deeply equal"

本文关键字:expected AssertionError undefined to equal deep 错误 消息 椅子      更新时间:2023-09-26

我写了一个函数,当给定一个对象列表和一个Id,返回相同的列表,但对应的对象标记为活动(所有其他对象都不应该处于活动状态)。

const list = [
     { id: 1, active: false },
     { id: 2, active: false },
     { id: 3, active: true  },
     { id: 4, active: false }
];
function markActive(list, value) {
  list.forEach((id) => {
    if (id.active = (id.id === value)) {
      return true;
    } else {
      return false;
    }
  });
}
markActive(list, 2);
console.log(list)

的回报:

[ { id: 1, active: false },
  { id: 2, active: false },
  { id: 3, active: false },
  { id: 4, active: true } ]

它的工作就像一个魅力,除了当我运行"npm run [filename]"我得到一个错误信息:

Running Tests for [filename].
------------
[ { id: 1, active: false },
  { id: 2, active: false },
  { id: 3, active: false },
  { id: 4, active: true } ]

  markActive
  1) Case 1 (Given Sample)
  2) Case 2 (String IDs)

  0 passing (16ms)
  2 failing
  1) markActive Case 1 (Given Sample):
     AssertionError: expected undefined to deeply equal [ { id: 1,        
     active: false },
     { id: 2, active: true },
     { id: 3, active: false },
     { id: 4, active: false } ]
     at Function.assert.deepEqual            
     (node_modules/chai/lib/chai/interface/assert.js:216:32)
      at Context.it (tests/test_02.js:23:12)
  2) markActive Case 2 (String IDs):
     AssertionError: expected undefined to deeply equal [ { id: '1',     
     active: false },
     { id: '2', active: true },
     { id: '3', active: false },
     { id: '4', active: false } ]
     at Function.assert.deepEqual   
     (node_modules/chai/lib/chai/interface/assert.js:216:32)
     at Context.it (tests/test_02.js:40:12)

知道我做错了什么吗?下面是设置测试的代码:

const chai    = require("chai");
const sinon   = require("sinon");
const assert  = chai.assert;
const markActive = require("../answers/02.js");
describe("markActive", () => {
  it("Case 1 (Given Sample)", () => {
  var list = [
         { id: 1, active: false },
         { id: 2, active: false },
         { id: 3, active: true  },
         { id: 4, active: false }
       ];
  var newList = markActive(list, 2);
  var targetList = [
         { id: 1, active: false },
         { id: 2, active: true  },
         { id: 3, active: false },
         { id: 4, active: false }
       ];
   assert.deepEqual(newList, targetList);
   });
  it("Case 2 (String IDs)", () => {
    var list = [
         { id: "1", active: false },
         { id: "2", active: false },
         { id: "3", active: true  },
         { id: "4", active: false }
       ];
    var newList = markActive(list, "2");
    var targetList = [
         { id: "1", active: false },
         { id: "2", active: true },
         { id: "3", active: false  },
         { id: "4", active: false }
       ];
    assert.deepEqual(newList, targetList);
  });
});

你的函数没有返回任何东西,所以你试图设置结果的任何变量都将被设置为undefined

要解决这个问题,只需在函数末尾添加一个return语句。

function markActive(list, value) {
  list.forEach((id) => {
    if (id.active = (id.id === value)) {
      return true;
    } else {
      return false;
    }
  });
  return list; // return the updated list
}

注意:值得一提的是,因为数组是被引用的,所以要就地修改值。这就是为什么您在函数外部定义的数组仍然具有更新的结果,即使您没有记录返回值。如果要在同一列表上多次运行markActive()函数,这可能会产生意想不到的副作用。如果你想要返回一个新的列表,看看Javascript中复制和深度复制数组的方法。