Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Testing if a Jasmine Test Fails

I'm trying to write a plugin for Jasmine that allows you to return a promise from a spec and will pass or fail that spec depending on whether or not the promise is fulfilled or rejected.

Of course, I want to write tests to make sure that my plugin works correctly, and to be thorough, I need to make sure that tests fail when the promise is rejected... so how do I make a test pass when I need to make sure that a test "successfully fails"?

like image 608
Joe Zim Avatar asked Feb 10 '23 00:02

Joe Zim


1 Answers

After a conversation with the developers who work on Jasmine, we've come up with this:

var FAILED = 'failed'
var PASSED = 'passed'

describe('My Test Suite', function () {
    var env

    beforeEach(function () {
        // Create a secondary Jasmine environment to run your sub-specs in
        env = new jasmine.Env()
    })

    it('should work synchronously', function () {
        var spec

        // use the methods on `env` rather than the global ones for sub-specs
        // (describe, it, expect, beforeEach, etc)
        env.describe('faux suite', function () {
            spec = env.it('faux test', function (done) {
                env.expect(true).toBe(true)
            })
        })

        // this will fire off the specs in the secondary environment
        env.execute()

        // put your expectations here if the sub-spec is synchronous
        // `spec.result` has the status information we need
        expect(spec.result.status).toBe(FAILED)
    })

    // don't forget the `done` argument for asynchronous specs 
    it('should work asynchronously', function (done) {
        var spec

        // use the methods on `env` rather than the global ones.
        env.describe('faux suite', function () {
            // `it` returns a spec object that we can use later
            spec = env.it('faux test', function (done) {
                Promise.reject("FAIL").then(done)
            })
        })

        // this allows us to run code after we know the spec has finished
        env.addReporter({jasmineDone: function() {
            // put your expectations in here if the sub-spec is asynchronous
            // `spec.result` has the status information we need
            expect(spec.result.status).toBe(FAILED)
            // this is how Jasmine knows you've completed something asynchronous
            // you need to add it as an argument to the main `it` call above
            done()
        }})

        // this will fire off the specs in the secondary environment
        env.execute()
    })
})
like image 160
Joe Zim Avatar answered Feb 11 '23 15:02

Joe Zim