首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用sinon摩卡从工厂测试对象

如何用sinon摩卡从工厂测试对象
EN

Stack Overflow用户
提问于 2017-07-06 12:49:10
回答 1查看 1.2K关注 0票数 0

背景

我有一个工厂的功能,创造狗叫:

代码语言:javascript
运行
复制
const dogFactory = () => {
    const bark = name => console.log(`${name} just barked!`);

    return{
        bark
    };
}; 

有人会像这样使用它:

代码语言:javascript
运行
复制
const dog = dogFactory();
dog.bark("boby"); //"boby just barked!"

我还有一家狗旅馆。生意不太好,所以为了保持形象,我正在创造自己的狗!因此,这家酒店以dogFactory作为参数,如下所示:

代码语言:javascript
运行
复制
const dogHotel = deps => {
    const {
        dogFactory
    } = deps;

    let dogsHosted = [];

    const feed = () => {
        dogsHosted.push(dogFactory());
        dogsHosted.forEach( (dog, i) => dog.bark(i));
    }

    return{
        feed
    };  
};

你会把它当作:

代码语言:javascript
运行
复制
const hotelAwsome = dogHotel({dogFactory: dogFactory});
hotelAwsome.feed();

这家旅馆养狗。因为没有生意,它创造了一只狗,然后喂每个人。每当一只狗被喂食时,它都会发出幸福的叫声!

问题

有人会认为在一家破碎的酒店里创造无限的狗是个问题,但事实并非如此!

这里的问题是,我想确保狗的叫声是快乐的。也就是说,对于酒店里的每一只狗来说,bark都是被呼叫的。

代码

这是我目前的测试。我使用mocha作为测试套件,使用sinon监视我的假工厂对象:

代码语言:javascript
运行
复制
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 
    });
});

这里的问题是,我是经过一个假狗工厂,但我不能检查是否狗叫!

问题

我该如何测试在酒店里被创造出来的狗是否在吠叫?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 12:58:15

你应该把间谍从假工厂搬出去。现在,您只需在expect中使用间谍属性 (callOnce,calls)。

Kudos关于有趣的问题:)

代码语言:javascript
运行
复制
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);
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44949360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档