Mocha断言错误:期望{}为字符串

时间:2016-09-14 18:38:47

标签: node.js mocha

我整个早上一直在打我的脑袋,我很确定我只是错过了一些简单的事情。当我期待一个字符串时,似乎我得到一个新对象({})作为返回值,但即使我为返回值硬编码一个字符串,我也得到相同的错误。

我已经毫无困难地完成了examples found here的工作。我的package.json设置为正确测试(或者至少我不认为这是问题所在,但我也可以发布它,如果它可以帮我解决问题)。我是Node.js的新手(但对JS很有经验)&只是学习Mocho&柴

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

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

const username = require('username');
exports.getUserName = function() {
    console.log(username.sync());
    return username.sync();
};

我已经使用Mocha& amp;编写了一个测试柴:

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)

如果我将测试更改为期望对象,则测试有效:expect(getUserName).to.be.an('object');

但是,如果我执行console.log(typeof username.sync());,则说它是一个字符串。

我需要做些什么来解决这个问题?

编辑解决方案:

这是我最终开始工作的代码。我认为问题的一部分是一个路径问题(我在Windows环境中),部分我根本就不太了解需要做什么,最后我不理解如何在测试中正确调用函数(参见下文)。

以下是修改后的username.js代码:

const username = require('username');
exports.getUserName = function() {
    console.log(username.sync());
    return username.sync();
}

此处修改了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');
    });
});

1 个答案:

答案 0 :(得分:2)

您没有执行该功能

更改

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

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

修改

我不知道你正在导出一个物体

exports.getUsername = function(){...}

应该是

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

感谢@robertklep