????????????????????????????????????????????????Ч?????????????????????????????????????????????????????????????????????????????????Щ???????????????????Node.js???????:Mocha??Should??SuperTest???????????????????????????????e?????????????

?????????????????
??????ν??????????????????????API????????????????????????????add1.js:
????functionadd(a??b)
????{
????returna+b;
????}
??????????д????????????????????ò???????????node??????:
????>add=function(a??b){returna+b}
????[Function:add]
????>add(4)
????NaN
??????add?????????????????4?????a?4??b?undefined??????????NaN??
????· ???????????????????????
????· ??????????????NaN?????????????
????· ????????????????????
??????????????????????????????????????
??????????add???????????????????????????????????undefined?????????????add2.js???????????:
functionadd(a??b)
{
if(typeofa==="number"&&typeofb==="number")
{
returna+b;
}
else
{
returnundefined;
}
}
????????????????????????д??????????????????????????д??????????????????????????????ν??TDD??Test-Driven-Development:?????????????????????????????????????????????????????:
????· ?????????????
????· ???????????????
????· ????????????????????????
????· ?????????????????
??????????-Mocha
???????????????test2.js???????add2.js????????????????Mocha???Node.js?????????Assert??
varadd=require("../add2.js");
varassert=require("assert");
//??2??????????????
it("shouldreturn3"??function()
{
varsum=add(1??2);
assert.equal(sum??3);
});
//????2???????String?
it("shouldreturnundefined"??function()
{
varsum=add(1??"2");
assert.equal(sum??undefined);
});
//?????1???????
it("shouldreturnundefined"??function()
{
varsum=add(1);
assert.equal(sum??undefined);
});
???????????????????????Mocha????it??????3??it????????????3?????????(testcase)??it???????1???????????????????????????????д?????????????????”shouldreturn3”;????2??????????????????д??????????????????????????????API???????????????????ж???н??????????
??????????????????Node.js?????????Assert??assert.equal???????????ж?add???????????????????assert.equal????????????????????????????
AssertionError?????????node???????:
>assert=require("assert");
>assert.equal(1??1);
undefined
>assert.equal(1??2);
AssertionError:1==2
atrepl:1:8
atsigintHandlersWrap(vm.js:22:35)
atsigintHandlersWrap(vm.js:96:12)
atContextifyScript.Script.runInThisContext(vm.js:21:12)
atREPLServer.defaultEval(repl.js:313:29)
atbound(domain.js:280:14)
atREPLServer.runBound[aseval](domain.js:293:12)
atREPLServer.<anonymous>(repl.js:513:10)
atemitOne(events.js:101:20)
atREPLServer.emit(events.js:188:7)
???????:
???????????Mocha??it??????д?????????????????Mocha?????????Щ????????assert.equal????????????????????????assert.equal?????????????AssertionError??Mocha?????????Щ?????????????????????
???????mocha???test2.js:
????mochatest/test2.js
??????????????????????????????
????· shouldreturn3
????· shouldreturnundefined
????· shouldreturnundefined
????3passing
???????????????test1.js????add1.js????????2????????????:
????· shouldreturn3
????1)shouldreturnundefined
????2)shouldreturnundefined
????1 passing(14ms)
????2 failing
????1)shouldreturnundefined:
????AssertionError:'12'==undefined
????atContext.<anonymous>(test/test1.js:18:12)
????2)shouldreturnundefined:
????AssertionError:NaN==undefined
????atContext.<anonymous>(test/test1.js:25:12)
?????????-Should
????Node.js?????????Assert?????????????????????У?Should???????????????????????á?
??????д?????merge????merge.js?????????????_.extend()??Object.assign()????????????????Object???????
functionmerge(a??b)
{
if(typeofa==="object"&&typeofb==="object")
{
for(varpropertyinb)
{
a[property]=b[property];
}
returna;
}
else
{
returnundefined;
}
}
????????????Shouldд????????????test3.js:
require("should");
varmerge=require("../merge.js");
//??2??????????????
it("shouldsuccess"??function()
{
vara={
name:"Fundebug"??
type:"SaaS"
};
varb={
service:"Realtimebugmonitoring"??
product:
{
frontend:"JavaScript"??
backend:"Node.js"??
mobile:"???С????"
}
};
varc=merge(a??b);
c.should.have.property("name"??"Fundebug");
c.should.have.propertyByPath("product"??"frontend").equal("JavaScript");
});
//?????1???????
it("shouldreturnundefined"??function()
{
vara={
name:"Fundebug"??
type:"SaaS"
};
varc=merge(a);
(typeofc).should.equal("undefined");
});
???????????????е??????????Should?????????:
????c.should.have.property("name"??"Fundebug");
????c.should.have.propertyByPath("product"??"frontend").equal("JavaScript");
????(typeofc).should.equal("undefined");
???????Should???:
????· ????????????????????????????
????· ??????????????????????????????????????????
???????Should?????????????c?????undefined???????????д:
????c.should.equal(undefined);//????д??????
???????:
????Should?????????????should???????????????????????????????????????????Щ????????????????????undefined??Should?????????????????????
???????node????????????Should????????a?????????should?????
????>a={}
????>typeofa.should
????'undefined'
????>require("should")
????>typeofa.should
????'object'
????????HTTP???-SuperTest
????Node.js?????????????????????????????????????????дHTTP???????????????????Node.js???????????????HTTP?????в????
????????Node.js?????HTTP???д?????????HTTP???server.js
varhttp=require("http");
varserver=http.createServer((req??res)=>
{
res.writeHead(200??
{
"Content-Type":"text/plain"
});
res.end("HelloFundebug");
});
server.listen(8000);
????????Mocha??????????HTTP????????:??????;???????????;??????????????Node.js?????http??assert????????test4.js:
require("../server.js");
varhttp=require("http");
varassert=require("assert");
it("shouldreturnhellofundebug"??function(done)
{
http.get("http://localhost:8000"??function(res)
{
res.setEncoding("utf8");
res.on("data"??function(text)
{
assert.equal(res.statusCode??200);
assert.equal(text??"HelloFundebug");
done();
});
});
});
????????????????????http.get????HTTP????????????????Mocha?????????????????it?????????????done??????????????????done??????Mocha???????????????????????
???????Node.js???????????????HTTP??????????????SuperTest????????????2??????test5.js:
varrequest=require("supertest");
varserver=require("../server.js");
varassert=require("assert");
it("shouldreturnhellofundebug"??function(done)
{
request(server)
.get("/")
.expect(200)
.expect(function(res)
{
assert.equal(res.text??"HelloFundebug");
})
.end(done);
});
?????????????????????????????
???????
????SuperTest????????HTTP???????????????????expect???????ж???????????????POST???????SuperTest??????????????????????Node.js??http??鷢??POST????????鷳???
??????????????????
??????????д??????????????????????????????????У??????????????????????顣?????????????ζ???????????????д???μ????????API??д?μ??????????????????????????????????????д??????????????????????????????20%??????????80%????????μ?20%????????????????????????????仰????????????????????BUG???????????