Skip to content

Commit

Permalink
Override global jasmine spec functions
Browse files Browse the repository at this point in the history
Currently, if a spec uses the global `it` function on an async test,
that test will always pass (since the jasmine version checked in Atom
does not natively support tests that return promises). This can be
confusing since the test behaviour is different between the
async-test-helpers methods and the global ones.

By overriding the global functions, we'll also be able to remove all the
imports from async-test-helpers since they won't be needed anymore.

More info: atom#18896 (comment)
  • Loading branch information
rafeca committed Feb 27, 2019
1 parent 2712b1f commit ea24038
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion spec/jasmine-test-runner.coffee
Expand Up @@ -10,6 +10,16 @@ module.exports = ({logFile, headless, testPaths, buildAtomEnvironment}) ->
window[key] = value for key, value of require '../vendor/jasmine'
require 'jasmine-tagged'

# Rewrite global jasmine functions to have support for async tests.
# This way packages can create async specs without having to import these from the
# async-spec-helpers file.
global.it = asyncifyJasmineFn global.it, 1
global.fit = asyncifyJasmineFn global.fit, 1
global.ffit = asyncifyJasmineFn global.ffit, 1
global.fffit = asyncifyJasmineFn global.fffit, 1
global.beforeEach = asyncifyJasmineFn global.beforeEach, 0
global.afterEach = asyncifyJasmineFn global.afterEach, 0

# Allow document.title to be assigned in specs without screwing up spec window title
documentTitle = null
Object.defineProperty document, 'title',
Expand Down Expand Up @@ -59,6 +69,28 @@ module.exports = ({logFile, headless, testPaths, buildAtomEnvironment}) ->
jasmineEnv.execute()
promise

asyncifyJasmineFn = (fn, callbackPosition) ->
(args...) ->
if typeof args[callbackPosition] is 'function'
callback = args[callbackPosition]

args[callbackPosition] = (args...) ->
result = callback.apply this, args
if result instanceof Promise
waitsForPromise(-> result)

fn.apply this, args

waitsForPromise = (fn) ->
promise = fn()

global.waitsFor('spec promise to resolve', (done) ->
promise.then(done, (error) ->
jasmine.getEnv().currentSpec.fail error
done()
)
)

disableFocusMethods = ->
['fdescribe', 'ffdescribe', 'fffdescribe', 'fit', 'ffit', 'fffit'].forEach (methodName) ->
focusMethod = window[methodName]
Expand Down Expand Up @@ -124,4 +156,4 @@ buildTerminalReporter = (logFile, resolveWithExitCode) ->
new JasmineListReporter(options)
else
{TerminalReporter} = require 'jasmine-tagged'
new TerminalReporter(options)
new TerminalReporter(options)

0 comments on commit ea24038

Please sign in to comment.