我是unitTesting并使用Mocha / Chai的新手。我试图测试函数是否有参数,如果它是一个数字。
// Main Function
function Sh(partnerUserId) {
function validPartnerId(partnerUserId) {
if (!partnerUserId);
throw new Error("Missing partnerId");
if (isNaN(partnerUserId));
throw new Error("Not a number");
return true;
}
}
// Unit Test
var expect = chai.expect;
describe("Sh", function() {
it('should check if the partnerId is provided', function(){
????
});
it('should check if the partnerId is a number', function(){
????
});
});
如果有更好的方法,我愿意接受建议。我试图找到如何捕获参数的值并在单元测试中验证它。
答案 0 :(得分:2)
您的Sohalo
功能目的尚不清楚。我不得不重写它以获得一个有意义的功能。无论如何,您需要使用什么来检查检查是否正在进行expect(fn).to.throw(...)
。它的文档是here。请注意,当您要检查具有特定参数的调用是否会引发异常时,方便的方法是使用bind
。如下所示:
expect(Sohalo.bind(undefined, 1)).to.not.throw(Error, "Not a number");
将测试通话Sohalo(1)
。 (bind
的第一个参数设置了函数内this
的值,我们在这里不需要它,所以我要离开它undefined
。
所以一个包含你的函数并测试它的文件看起来像这样:
function Sohalo(partnerUserId) {
if (typeof partnerUserId !== "number" || isNaN(partnerUserId))
throw new Error("Not a number");
}
var chai = require("chai");
var expect = chai.expect;
describe("Sohalo", function() {
it('should fail if partnerUserId is not given', function(){
// This tests calling Sohalo with no arguments whatsoever.
expect(Sohalo).to.throw(Error, "Not a number");
});
it('should fail if partnerUserId is not a number', function(){
expect(Sohalo.bind(undefined, {})).to.throw(Error, "Not a number");
});
it('should fail if partnerUserId is NaN', function(){
expect(Sohalo.bind(undefined, NaN)).to.throw(Error, "Not a number");
});
it('should not fail if the partnerUserId is a literal number', function(){
expect(Sohalo.bind(undefined, 1)).to.not.throw(Error, "Not a number");
});
it('should not fail if the partnerUserId is a Number object', function(){
expect(Sohalo.bind(undefined, Number(10))).to.not.throw(Error, "Not a number");
});
});
在我的测试套件中,我通常会使用expect().to.throw
执行测试,但不会使用expect().to.not.throw
执行测试。我只是用好的参数调用它并检查结果是否正确,而不是显式检查函数是否抛出。我在这里使用expect().to.not.throw
仅仅是为了说明。
答案 1 :(得分:0)
使用类似的东西:
function isNumber(x) {
return typeof x === 'number';
}
然后,在其他地方,您可以使用isNumber
函数来确定x
是否为数字,并做出相应的反应:
function Sohalo (partnerUserId) {
if (!isNumber(partnerUserId)) {
// if it's not a number, throw exception
throw new Error('partnerUserId needs to be a number!');
}
// ... do other stuff down here ...
}
单元测试建议:
创建一个这样的对象:
var sohalo = (function () {
var me = {},
id;
function isNumber(x) {
return typeof x === 'number';
}
function isDefined(x) {
return typeof value !== 'undefined';
}
me.validatePartnerId = function () {
return isDefined(id) && isNumber(id);
}
me.setPartnerId = function (newId) {
id = newId;
};
me.getPartnerId = function () {
return id;
};
return me;
})();
describe('sohalo', function () {
it('should check if the partner id is provided', function () {
var id = sohalo.getPartnerId();
id.should.equal(undefined);
});
it('should check if the partner id is a number', function () {
sohalo.setPartnerId(5);
sohalo.validatePartnerId().should.equal(true);
sohalo.setPartnerId('5');
sohalo.validatePartnerId().should.equal(false);
});
});
这是我发现的一个帖子,它给出了一个小例子:https://gist.github.com/michaelcox/3800736。
希望这有帮助