我有一个工厂功能,可以创造出吠叫的狗:
const dogFactory = () => {
const bark = name => console.log(`${name} just barked!`);
return{
bark
};
};
人们可以使用它:
const dog = dogFactory();
dog.bark("boby"); //"boby just barked!"
我还有一家狗酒店。生意不顺利,所以为了保持外表,我正在创造自己的狗!因此,这家酒店以dogFactory
为参数,如下所示:
const dogHotel = deps => {
const {
dogFactory
} = deps;
let dogsHosted = [];
const feed = () => {
dogsHosted.push(dogFactory());
dogsHosted.forEach( (dog, i) => dog.bark(i));
}
return{
feed
};
};
您可以使用它:
const hotelAwsome = dogHotel({dogFactory: dogFactory});
hotelAwsome.feed();
这家酒店供应狗。因为没有生意所以它会创造一条狗,然后喂养每个人。每当一只狗被喂食,它就会快乐起来!
有人会认为在破碎的酒店里制造无限的狗会是问题,但事实并非如此!
这里的问题是我想确保狗快乐地吠叫。也就是说,正在调用酒店bark
中的每只狗。
这是我目前的考试。我使用mocha
作为测试套件,我使用sinon
来监视我的假工厂对象:
const sinon = require( "sinon" );
const chai = require( "chai" );
const expect = chai.expect;
describe("dog hotel", () => {
const fakeFacory = () => {
const bark = () => sinon.spy()
return {bark};
};
it("should make the dogs bark with happiness when feeding them!", () => {
const hotelAweomse = dogHotel({dogFactory: fakeFacory});
hotelAwesome.feed();
//expect something here
});
});
这里的问题是我经过一家假狗工厂,但如果这只狗正在吠叫,我无法与sinon核实!
如何测试在酒店创建的狗是否在吠叫?
答案 0 :(得分:1)
你应该将间谍创作移出假工厂。现在你可以在期望中使用间谍properties(callOnce,calls)。
对于有趣的问题感到荣幸:)
describe("dog hotel", () => {
const spy = sinon.spy(); // create the spy outside
const fakeFacory = () => {
return {
bark: spy // assign it to bark
};
};
it("should make the dogs bark with happiness when feeding them!", () => {
const hotelAweomse = dogHotel({dogFactory: fakeFacory});
hotelAwesome.feed();
// expect only one bark
expect(spy.calledOnce).to.be.true;
// expect a number of barks
expect(spy.calls).to.equal(1);
});
});