Files
probot/docs/testing.md
Ben Scott fba83a10c6 docs: Tweak payload info in testing.md (#575)
This helps enforce the idea that a payload fixture file should be the
webhook payload body, so that the fixture can be referenced by both
tests and `probot simulate`.
2018-06-20 17:26:40 -07:00

2.5 KiB

next
next
docs/logging.md

Testing

We highly recommend working in the style of test-driven development when creating probot apps. It is frustrating to constantly create real GitHub events in order to test an app. Redelivering webhooks is possible and can be accessed in your app's settings page under the Advanced tab. We do offer the above documented simulate method to help make this easier; however, by writing your tests first, you can avoid repeatedly recreating actual events from GitHub to check if your code is working.

For our testing examples, we use jest, but there are other options that can perform similar operations. Here's an example of creating an app instance and mocking out the GitHub API:

// Requiring probot allows us to initialize an application
const {Application} = require('probot')
// Requiring our app implementation
const plugin = require('')
// Create a fixtures folder in your test folder
// Then put any larger testing payloads in there
const payload = require('./fixtures/payload')

describe('your-app', () => {
  let app
  let github

  beforeEach(() => {
    // Here we create an `Application` instance
    app = new Application()
    // Here we initialize the app
    app.load(plugin)
    // This is an easy way to mock out the GitHub API
    github = {
      issues: {
        createComment: jest.fn().mockReturnValue(Promise.resolve({
          // Whatever the GitHub API should return
        }))
      }
    }
    // Passes the mocked out GitHub API into out app instance
    app.auth = () => Promise.resolve(github)
  })

  describe('your functionality', () => {
    it('performs an action', async () => {
      // Simulates delivery of a payload
      // event is the X-GitHub-Event header sent by GitHub (for example "push")
      // payload is the webhook payload body
      await app.receive({event: 'push', payload})
      // This test would pass if in your main code you called `context.github.issues.createComment`
      expect(github.issues.createComment).toHaveBeenCalled()
    })
  })
})

A good testing example from update-docs can be found here, and another one from owners can be found here.