如何使用带有sinon的mocha从工厂测试对象

时间:2017-07-06 12:49:11

标签: javascript unit-testing testing mocha sinon

背景

我有一个工厂功能,可以创造出吠叫的狗:

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核实!

问题

如何测试在酒店创建的狗是否在吠叫?

1 个答案:

答案 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);
    });
});