Node.js Mocha断言错误:预期{}为字符串

Node.js Mocha断言错误:预期{}为字符串,node.js,mocha.js,Node.js,Mocha.js,我整个上午都在为此绞尽脑汁,我很确定我只是错过了一些简单的事情。当我需要一个字符串时,我似乎得到了一个新对象({})作为返回值,但即使我硬编码一个字符串作为返回值,我也会得到同样的错误 我顺利地完成了这项工作。我的package.json设置为正确测试(或者至少我认为这不是问题所在,但如果它有助于解决我的问题,我也可以发布它)。我是Node.js新手(但对js很有经验)&只是在学习Mocho和Chai 我错过了什么?为什么我应该得到一个字符串,却得到了一个看似空的对象?是什么导致测试失败的 我编

我整个上午都在为此绞尽脑汁,我很确定我只是错过了一些简单的事情。当我需要一个字符串时,我似乎得到了一个新对象({})作为返回值,但即使我硬编码一个字符串作为返回值,我也会得到同样的错误

我顺利地完成了这项工作。我的
package.json
设置为正确测试(或者至少我认为这不是问题所在,但如果它有助于解决我的问题,我也可以发布它)。我是Node.js新手(但对js很有经验)&只是在学习Mocho和Chai

我错过了什么?为什么我应该得到一个字符串,却得到了一个看似空的对象?是什么导致测试失败的

我编写了一个简单的API,用于从主机PC获取用户名:

const username = require('username');
exports.getUserName = function() {
    console.log(username.sync());
    return username.sync();
};
我用摩卡和柴做了一个测试:

var expect = require("chai").expect;
var getUserName = require('./username.js');

describe("User name API", function () {
it("Returns a string with the user's name", function () {
    expect(getUserName).to.be.a('string');
    });
});
以下是使用
npm test
运行测试时返回的错误:

> sbserialwidget@0.0.1 test C:\deg\node_modules\sbSerialWidget
> mocha --reporter spec

running

  User name API
    1) Returns a string with the user's name

  0 passing (13ms)
  1 failing

  1) User name API Returns a string with the user's name:
     AssertionError: expected {} to be a string
      at Context.<anonymous> (C:\deg\node_modules\sbSerialWidget\test\username.js:6:29)
      at callFn (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runnable.js:334:21)
      at Test.Runnable.run (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runnable.js:327:7)
      at Runner.runTest (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:429:10)
      at C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:535:12
      at next (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:349:14)
      at C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:359:7
      at next (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:285:14)
      at Immediate._onImmediate (C:\deg\node_modules\sbSerialWidget\node_modules\mocha\lib\runner.js:327:5)
下面是修改后的
usernametest.js

var expect = require("chai").expect;
//here's where one point of confusion was, I was trying to call the original getUserName()
//function, but it's been turned into a variable called username
var username = require('..\\js\\username.js').getUserName;

describe("User name API", function () {
    it("returns a string with the user's name", function () {
        //so here, instead of calling username.getUserName(), I call username()
        //instead.  Voila, it works...
        expect(username()).to.be.a('string');
    });
});

您没有执行该函数

改变

expect(getUserName.to.be.a('string')

expect(getUserName()).to.be.a('string')

编辑

我不知道你是在导出一个对象

exports.getUsername=function(){…}

应该是

expect(getUserName.getUserName()).to.be.a('string')


感谢@robertklep

您没有执行该函数

改变

expect(getUserName.to.be.a('string')

expect(getUserName()).to.be.a('string')

编辑

我不知道你是在导出一个对象

exports.getUsername=function(){…}

应该是

expect(getUserName.getUserName()).to.be.a('string')


感谢@robertklep

不仅如此,还有
username.js
导出了一个名为
getUserName
的函数的对象,所以要让它工作,它应该是
getUserName.getUserName()
。当我尝试这样做时,错误变为:
TypeError:getUserName不是函数
。另外,作为对@robertklep的回应,做出这样的改变也会产生类似的错误:
TypeError:getUserName.getUserName不是一个函数
@delliottg,有@stalin和我自己提出的修复方案,对我来说效果很好。嗯,我不确定这是怎么搞砸的。我构建了一个全新的项目,复制了相关文件,在所需的库上运行了
npm install
,编辑了
package.json
,以指向测试的正确位置,我仍然收到相同的TypeError消息。想法?感谢大家的帮助和建议,我终于找到了一个解决方案(见编辑的OP)。不仅如此,还有
username.js
导出一个名为
getUserName
的函数的对象,所以要让它工作,应该是
getUserName.getUserName()
。当我尝试时,错误更改为:
TypeError:getUserName不是函数。另外,作为对@robertklep的回应,做出这样的改变也会产生类似的错误:
TypeError:getUserName.getUserName不是一个函数
@delliottg,有@stalin和我自己提出的修复方案,对我来说效果很好。嗯,我不确定这是怎么搞砸的。我构建了一个全新的项目,复制了相关文件,在所需的库上运行了
npm install
,编辑了
package.json
,以指向测试的正确位置,我仍然收到相同的TypeError消息。想法?感谢大家的帮助和建议,我终于找到了解决方案(见编辑的OP)。
var expect = require("chai").expect;
//here's where one point of confusion was, I was trying to call the original getUserName()
//function, but it's been turned into a variable called username
var username = require('..\\js\\username.js').getUserName;

describe("User name API", function () {
    it("returns a string with the user's name", function () {
        //so here, instead of calling username.getUserName(), I call username()
        //instead.  Voila, it works...
        expect(username()).to.be.a('string');
    });
});