簡體   English   中英

如何使用sinon的摩卡咖啡從工廠測試對象

[英]How to test object from factory with mocha with 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詢問狗狗是否在吠叫!

我如何測試在酒店里養的狗是否吠叫?

您應該將間諜創建移出偽造工廠。 現在,您可以只在期望中使用間諜屬性 (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);
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM