【发布时间】:2016-09-14 18:38:46
【问题描述】:
我整个早上都在为此苦苦挣扎,我很确定我只是错过了一些简单的东西。当我期待一个字符串时,似乎我正在为返回值获取一个新对象 ({}),但即使我为返回值硬编码一个字符串,我也会得到相同的错误。
我已经顺利完成了examples found here。我的package.json 设置为正确测试(或者至少我认为这不是问题,但如果它有助于解决我的问题,我也可以发布它)。我是 Node.js 的新手(但在 JS 方面经验丰富)并且刚刚学习 Mocho 和 Chai。
我错过了什么?当我应该得到一个字符串时,为什么我得到一个似乎是空的对象?是什么导致测试失败?
我编写了一个简单的 API 来从主机 PC 获取用户名:
const username = require('username');
exports.getUserName = function() {
console.log(username.sync());
return username.sync();
};
我已经使用 Mocha & Chai 编写了一个测试:
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');
});
});
【问题讨论】: