如何模拟 mongodb 以进行单元测试 graphql 解析器

Posted

技术标签:

【中文标题】如何模拟 mongodb 以进行单元测试 graphql 解析器【英文标题】:How to mock mongodb for unit testing graphql resolver 【发布时间】:2019-02-22 14:52:51 【问题描述】:

我正在学习 graphql 并想为我的解析器进行单元测试(即获取“答案”的查询)。问题是我的解析器使用 mongoose 从幕后的 mongodb 查询数据,我不知道如何模拟这些电话。

谁能帮我解决这个问题?谢谢。

我的查询的解析器是这样的:

const  Book, Author  = require('../models')    

module.exports = 
  answers: async ( parent,  searchText  ) =>         
    let authors = null;
    let books = null;
    try 
        authors = await Author.find();            
        books = await Book.find(); 
        return getAnswers(authors,books, searchText);
    catch (err) 
        console.log(err);
            
    return null;
 


function getAnswers(books,authors,text) 
    <!-- process data here -->

【问题讨论】:

【参考方案1】:

您正在寻找proxyquire。它允许您覆盖所需文件中的依赖项。您的测试文件可能看起来像这样

const proxyquire = require('proxyquire');
const mockBook = ...

describe('Test #1', function() 
    const stubs = 
        '../models': 
            Book: 
                find: () => Promise.resolve(mockBook),
            ,
            Author: // Same as book
        ,
    ;

    const myfile = proxyquire('./myfile', stubs);
    let answers;

    before(async function() 
        answers = await myfile.answers();
    );

    describe("should succeed", function() 
        expect(answers).to.be.equal(ExpectedAnswers);
    );
);

现在,该代码还没有运行,肯定不会成功。这是为了让您了解如何使用 proxyquire。

至于代码的getAnswers() 部分,您还需要模拟该函数的依赖关系,就像上面示例中为Book 所做的那样。

【讨论】:

【参考方案2】:

您可以使用 graphql-tools here is a link to the blog

npm install graphql-tools

将架构导入测试文件

import  mockServer  from 'graphql-tools';
import schema from './schema.js';

describe('mock server', () => 
  it('should mock the server call', async () => 
    const myMockServer = mockServer(schema, 
      String: () => 'Hello', // <--- expecting a `hello` to be returned
    );
    const response = await myMockServer.query(`
      users 
        username,
      
    `);

    const expected =   // This shape of the data returned
      data: 
        users: [
          
            "username": "Hello"
          ,
          
            "username": "Hello"
          ,
       ]
    
  
  expect(response).toMatchObject(expected);
);
);

【讨论】:

graphql-tools 允许你创建一个 mockServer。问题是关于在服务器中模拟对 MongoDB within 的调用。

以上是关于如何模拟 mongodb 以进行单元测试 graphql 解析器的主要内容,如果未能解决你的问题,请参考以下文章

如何模拟 Azure 队列存储以进行单元测试?

如何模拟 acegi 身份验证服务以进行单元测试?

用玩笑进行单元测试时,如何以角度模拟 ResizeObserver polyfill?

如何在 Angular 组件中模拟服务功能以进行单元测试

您如何在 C# 中模拟文件系统以进行单元测试?

如何在 Spring Security Bean 中模拟自定义 UserService 详细信息以进行单元测试?