Search code examples
jasmineamplifyjs

Using jasmine to test amplifyjs request call backs


I'm using amplifyjs for AJAX requests. That's working fine. I'm using jasmine to test the code. I'm wondering what the best method is to test the success and error call backs. The current unit test I've written doesn't work because the call back is executed after the jasmine expect. Here's my code under test:

function logout() {
    ns.busy.show();

    amplify.request({
        resourceId: 'logout',
        success: _logoutSuccess
    });
};
function _logoutSuccess(response) {
    ns.busy.hide();
};

Here's the unit test, where I want to validate that a function is called when the request is returned:

it('should hide busy when successful', function () {
            // arrange
            ns.busy = { show: function () { }, hide: function () { } };
            spyOn(ns.busy, 'hide');
            amplify.request.define('logout', function (settings) {
                settings.success({});
            });

            // act
            ns.accountLogoutViewModel.logout();

            // assert
            expect(ns.busy.hide).toHaveBeenCalled();
        });

Note: ns is just a variable holding the application namespace. If I place break points on the expect and on the ns.busy.hide() in the _logoutSuccess function, jasmine hits the expect and then hits the _logoutSuccess, hence the spyOn fails.

As I say, the code is working, I just want to know how to write a test for it. I've looked into the jasmine done() function, but I'm not sure how to use it in this circumstance (or even if it is a solution).

Thanks


Solution

  • Isn't it always the way, when I finally get round to posting a question, I then immediately find the answer. Here's the test that passes, using the jasmine done() function:

    it('should hide busy when successful', function (done) {
                // arrange
                ns.busy = { show: function () { }, hide: function () { } };
                spyOn(ns.busy, 'hide');
                amplify.request.define('logout', function (settings) {
                    settings.success({});
                    done();
                });
    
                // act
                ns.accountLogoutViewModel.logout();
    
                // assert
                expect(ns.busy.hide).toHaveBeenCalled();
            });