首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟第三方方法+玩笑

模拟第三方方法+玩笑
EN

Stack Overflow用户
提问于 2020-08-05 07:57:33
回答 1查看 1.2K关注 0票数 0

我在后端单元测试中使用jest,我需要使用它来模拟第三方库模块方法,我尝试了以下代码:

我的控制器文件:

代码语言:javascript
复制
    const edgejs = require('apigee-edge-js');
    const apigeeEdge = edgejs.edge;
   async get(req, res) {
    const abc= await apigeeEdge.connect(connectOptions);
    const Details = await abc.developers.get(options);
    return res.status(200).send(Details);
  }

test.spec.js

代码语言:javascript
复制
    let edgejs = require('apigee-edge-js');
    const ctrl = require('../../controller');
    describe("Test suite for abc", () => {
        test("should return ...", async() =>{        
            edgejs.edge = jest.fn().mockImplementationOnce(async () => 
            {return  {"connect":{"developers":{"get":[{}]}}}}
           );
         ctrl.get(req, res)    
    });

但是它不是在模仿,而是调用实际的库连接方法。我在这里做错了什么。请分享你的想法。提前谢谢。

工作代码

代码语言:javascript
复制
jest.mock('apigee-edge-js', () => {
    return { edge: { connect: jest.fn() } };
  });

    const edgejs = require('apigee-edge-js');
    test("should return ...", async () => {
        edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
            {"developers":{"get":[{}]}}
          ));    
        edgejs.edge.connect()
        expect(edgejs.edge.connect).toBeCalled();
        
      })

错误代码:

代码语言:javascript
复制
jest.mock('apigee-edge-js', () => {
    return { edge: { connect: jest.fn() } };
  });

const Ctrl = require('../../controllers/controller'); ----> Extra line
const edgejs = require('apigee-edge-js');

test("should return ...", async () => {
    edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
        {"developers":{"get":[{}]}}
      ));
    const req = mockRequest();
     const res = mockResponse();
    await Ctrl.get(req, res)  ---> Extra line
    expect(edgejs.edge.connect).toBeCalled();       
    
  });

Receceivig : TypeError: edgejs.edge.connect.mockImplementationOnce不是一个函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 10:30:12

模拟不会影响任何东西,因为controller在导入edgejs.edge之后立即取消apigeeEdge = edgejs.edge。如果它使用的是edgejs.edge.connect而不是apigeeEdge.connect,这将是不同的。

方法不应该被模拟为... = jest.fn(),因为这会阻止它们被还原,并且可能会影响之后的其他测试;这就是jest.spyOn的作用所在。此外,edge是一个对象,而不是一个方法。

Jest提供模块模拟功能。第三方库通常需要在单元测试中进行模拟。

它应该是:

代码语言:javascript
复制
jest.mock('apigee-edge-js', () => {
  return { edge: { connect: jest.fn() } };
});

const ctrl = require('../../controller');
const edgejs = require('apigee-edge-js');

test("should return ...", async () => {
  edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
    {"developers":{"get":[{}]}}
  ));
  await ctrl.get(req, res)
  ...
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63260760

复制
相关文章

相似问题

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