Тестирование вашего кода - это всегда хорошая практика, которую вы должны реализовать. Тесты, которые вы проводите, помогут вам предотвратить некоторые ошибки, а также гарантируют, что ваше приложение работает так, как вы думаете, что оно должно работать.

Иногда создание тестов может быть трудным и требует большого количества кода, но в большинстве случаев это зависит от реализации, которую вы используете для тестирования своего кода; есть пакеты, которые помогут вам проводить тесты с помощью нескольких строк кода.

Сегодня я собираюсь представить easygraphql-tester, пакет npm, который поможет вам протестировать вашу схему, запросы и мутации как на стороне сервера, так и на стороне клиента.

Как им пользоваться?

Использование easygraphql-tester не требует большого количества дополнительного кода для тестирования вашей схемы, запросов и мутаций.

Первые шаги:

  • Импортируйте пакет easygraphql-tester
  • Прочтите схему GraphQL
  • Инициализировать тестер и передать ему schemaCode
const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema.gql'), 'utf8')

const tester = new EasyGraphQLTester(schemaCode)

Проверить запрос:

  • Задайте запрос как const
  • Вызов test из tester передать в качестве первого аргумента, если тест должен пройти, в качестве второго аргумента - мутация, а в качестве третьего - переменные, которые ожидаются на входе.
const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')
const tester = new EasyGraphQLTester(schemaCode)

const query = `
  {
    getMe {
      id
      email
      familyInfo {
        father {
          email
        }
        mother {
          username
        }
      }
    }
  }
`
tester.test(true, query)

Если запрос выполнен успешно, он вернет имитацию запрошенных вами полей. Тестировщик также собирается проверить аргументы, если запрос ожидает их, а также тип аргумента.

Проверьте мутацию:

  • Установите мутацию как const
  • Вызов test из tester передать в качестве первого аргумента, если тест должен пройти, в качестве второго аргумента - мутация, а в качестве третьего - переменные, которые ожидаются на входе.
const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')
const tester = new EasyGraphQLTester(schemaCode)

const mutation = `
  mutation CreateUser{
    createUser {
      email
    }
  }
`
tester.test(true, mutation, {
  email: '[email protected]',
  username: 'test',
  fullName: 'test',
  password: 'test'
})

Если запрос выполнен успешно, он вернет имитацию полей, которые вы запросили при мутации.

Мокирующие запросы и мутации:

easygraphql-tester может работать как насмешник над вашим запросом или изменением, пользоваться им просто.

Вызовите метод .mock() и передайте объект с этими параметрами:

  • query: это будет запрос / мутация для проверки.
  • переменные: это требуется, если это мутация, это должен быть объект с полями ввода.
  • fixture: это необязательно, если вы хотите передать свои собственные приспособления.
  • saveFixture: по умолчанию false, если вы передаете фикстуры и устанавливаете для него значение true, когда вы снова делаете тот же запрос, он вернет значение фикстуры.

Результат будет иметь поля верхнего уровня, это означает, что результатом будет объект со свойством, которое будет именем (полем верхнего уровня) запроса или псевдонимом с имитацией результата.

Мнимый пример

'use strict'
const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')
const userSchema = fs.readFileSync(path.join(__dirname, 'schema', 'user.gql'), 'utf8')
const tester = new EasyGraphQLTester(userSchema)
const query = `
  {
    getUser(id: "1") {
      id
      name
      familyInfo {
        lastName
        email
      }
    }
  }
`
const fixture = {
  id: '1',
  name: 'EasyGraphQL'
}
const { getUser } = tester.mock({ query, fixture })
// getUser
{ 
  id: '1',
  name: 'EasyGraphQL',
  familyInfo: [
    { 
      lastName: 'Bartoletti',
      email: '[email protected]'
    },
    { 
      lastName: 'Bartoletti',
      email: '[email protected]'
    },
    { 
      lastName: 'Bartoletti',
      email: '[email protected]'
    }
  ]
}

Ошибки:

Если в запросе есть ошибка или мутация easygraphql-tester сообщит вам, что происходит.

Попытка получить доступ к недопустимому идентификатору поля в getMe - ›отец

const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')
const tester = new EasyGraphQLTester(schemaCode)

const query = `
  {
    getMe {
      id
      email
      familyInfo {
        father {
          id
          email
        }
      }
    }
  }
`
tester.test(true, query) // Error: Invalid field id on getMe

Недействительные аргументы в запросе

const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')
const tester = new EasyGraphQLTester(schemaCode)

const getUserByUsername = `
  {
    getUserByUsername(username: 1, name: test) {
      email
    }
  }
`

tester.test(true, getUserByUsername) // Error: username argument is not type String

Отсутствует поле при вводе

const EasyGraphQLTester = require('easygraphql-tester')
const fs = require('fs')
const path = require('path')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')
const tester = new EasyGraphQLTester(schemaCode)

const mutation = `
  mutation CreateUser{
    createUser {
      email
    }
  }
`
const test = tester.test(true, mutation, {
  email: '[email protected]',
  fullName: 'test',
  password: 'test'
})
// Error: username argument is missing on createUser

Использование с Mocha & Chai:

Чтобы получить лучшие результаты в своем тесте, вы можете использовать его с Mocha & Chai (также вы можете использовать его со своими любимыми), чтобы проверить результаты и проверить возвращаемые поля.

'use strict'

const fs = require('fs')
const path = require('path')
const { expect } = require('chai')
const EasyGraphQLTester = require('../lib')

const schemaCode = fs.readFileSync(path.join(__dirname, 'schema', 'schema.gql'), 'utf8')

describe('Mutation', () => {
  let tester

  before(() => {
    tester = new EasyGraphQLTester(schemaCode)
  })

  describe('Should throw an error if variables are missing', () => {
    it('Should throw an error if the variables are missing', () => {
      let error
      try {
        const mutation = `
          mutation CreateUser{
            createUser {
              email
            }
          }
        `
        tester.mock(mutation)
      } catch (err) {
        error = err
      }

      expect(error).to.be.an.instanceOf(Error)
      expect(error.message).to.be.eq('Variables are missing')
    })
  })

  describe('Should return selected fields', () => {
    it('Should return selected fields', () => {
      const mutation = `
        mutation CreateUser{
          createUser {
            email
          }
        }
      `
      const test = tester.mock(mutation, {
        email: '[email protected]',
        username: 'test',
        fullName: 'test',
        password: 'test'
      })

      expect(test).to.exist
      expect(test.email).to.be.a('string')
    })
  })
})

Если вам нравится этот пакет, не забудьте поставить на GitHub.

Демо с моками: https://repl.it/@alejandroestrada/easygraphql-tester

Демо с Jest: https://codesandbox.io/s/42m2rx71j4

Репо: https://github.com/EasyGraphQL/easygraphql-tester

npm: https://www.npmjs.com/package/easygraphql-tester

Сайт: https://easygraphql.com/