在Javascript中使用assert for NaN

在Javascript中使用assert for NaN,javascript,node.js,unit-testing,Javascript,Node.js,Unit Testing,我正在尝试使用assert.deepstriefqual测试我的输出是否为NaN,如所示。但是考试不会通过 功能代码: function howManyServings (params) { const {recipe, inventory} = params bread_confirm = Math.floor(inventory.bread / recipe.bread) peanutButter_confirm = Math.floor(inventory.peanutBut

我正在尝试使用
assert.deepstriefqual
测试我的输出是否为
NaN
,如所示。但是考试不会通过

功能代码:

function howManyServings (params) {
  const {recipe, inventory} = params

  bread_confirm = Math.floor(inventory.bread / recipe.bread)
  peanutButter_confirm = Math.floor(inventory.peanutButter / recipe.peanutButter)
  jam_confirm = Math.floor(inventory.jam / recipe.jam)

  minimum_servings = Math.min(bread_confirm, peanutButter_confirm, jam_confirm)
  return minimum_servings
}
测试代码:

const assert = require('assert');
const {howManyServings} = require('./index');
const inputs = require('./inputs')

describe('Nomnomthrough', () => {
  describe('When there is enough ingredient for one serving', () => {
    it('should return 1', () => {
      const output = howManyServings(inputs.oneServing);
      assert.equal(output, 1);
    });
  });
  describe('When there is enough for two servings', () => {
    it('should return 2', () => {
        const output = howManyServings(inputs.twoServings);
        assert.equal(output, 2)
    })
  })
  describe('When the amount is not an integer', () => {
    it('should return false', () => {
        const output = howManyServings(inputs.nonintegerValue);
        assert.deepStrictEqual(output, NaN)
    })
  })
});
输入代码:

module.exports = {
  oneServing: {
    recipe: {
      bread: 10,
      peanutButter: 5,
      jam: 5
    },
    inventory: {
      bread: 20,
      peanutButter: 10,
      jam: 5
    }
  },

  twoServings: {
    recipe: {
      bread: 10,
      peanutButter: 5,
      jam: 5
    },
    inventory: {
      bread: 20,
      peanutButter: 10,
      jam: 10
    }
  },

  nonintegerValue: {
    recipe: {
      bread: 10,
      peanutButter: 5,
      jam: 5
    },
    inventory: {
      bread: 20,
      peanutButter: 10,
      jam: 'sfsf'
    }
  }
}

代码返回
NaN
,但它没有被识别为等于
NaN
,我认为
deepstriefqual
会这样做。

要检查
输出
变量是否为
NaN
,您可以像这样使用:

或者

或者


如报告中所述:

根据
NaN进行测试
NaN
将不相等(通过
=
!=
==
!=
)与任何其他值(包括另一个NaN值)进行比较。使用
Number.isNaN()
isNaN()
最清楚地确定值是否为NaN。或者进行自我比较:NaN,而且只有NaN,会与自身进行不平等的比较

NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

function valueIsNaN(v) { return v !== v; }
valueIsNaN(1);          // false
valueIsNaN(NaN);        // true
valueIsNaN(Number.NaN); // true

要检查
输出
变量是否为
NaN
,您可以使用如下命令:

或者

或者


如报告中所述:

根据
NaN进行测试
NaN
将不相等(通过
=
!=
==
!=
)与任何其他值(包括另一个NaN值)进行比较。使用
Number.isNaN()
isNaN()
最清楚地确定值是否为NaN。或者进行自我比较:NaN,而且只有NaN,会与自身进行不平等的比较

NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

function valueIsNaN(v) { return v !== v; }
valueIsNaN(1);          // false
valueIsNaN(NaN);        // true
valueIsNaN(Number.NaN); // true

NaN
不等于它本身。在控制台中尝试
NaN===NaN
。尝试:
assert.equal(isNaN(output),true)
@palaѕ为什么不干脆
assert(isNaN(output))
?@Mark_M是的,我们也可以这样做,或者
assert.ok(isNaN(output))
也可以。@Amon不,你误解了
NaN
。NaN是JS中唯一不等于自身的值。我并不是说比较两个看起来相似的不同对象/引用。试试这个
var value=NaN;console.log(值,value==value)
NaN是JS中唯一一个比较结果为false的值;没有涉及任何引用或其他内容,只是将一个原语值与它自身进行比较,结果返回false;这是故意的。
NaN
并不等于它自己。在控制台中尝试
NaN===NaN
。尝试:
assert.equal(isNaN(output),true)
@palaѕ为什么不干脆
assert(isNaN(output))
?@Mark_M是的,我们也可以这样做,或者
assert.ok(isNaN(output))
也可以。@Amon不,你误解了
NaN
。NaN是JS中唯一不等于自身的值。我并不是说比较两个看起来相似的不同对象/引用。试试这个
var value=NaN;console.log(值,value==value)
NaN是JS中唯一一个比较结果为false的值;没有涉及任何引用或其他内容,只是将一个原语值与它自身进行比较,结果返回false;这是故意的。
assert.ok(isNaN(output))
NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

function valueIsNaN(v) { return v !== v; }
valueIsNaN(1);          // false
valueIsNaN(NaN);        // true
valueIsNaN(Number.NaN); // true