Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to actually reset $httpBackend expectations?

I've tried and tried to get this to work. The documentation is terse, at best:

resetExpectations(); - Resets all request expectations, but preserves all backend definitions. Typically, you would call resetExpectations during a multiple-phase test when you want to reuse the same instance of $httpBackend mock.

Every time my second request is called, my result always has the first result's data. Check out this fiddle http://jsfiddle.net/tbwn1gt0/2/ where I reset the expectations after the first flush, then set new expectations/result then flush again to yield the incorrect data.

// --- SPECS -------------------------
var url = '/path/to/resource';
var result = '';

describe('$httpBackend', function () {

    it("expects GET different results in subsequent requests", inject(function ($http, $httpBackend) {

        successCallback = function(data){
            result = data;            
        }
        // Create expectation
        $httpBackend.expectGET(url).respond(200, 'mock data');

        // Call http service
        $http.get(url).success(successCallback);

        // flush response
        $httpBackend.flush();
        console.log( result ); // logs 'mock data'

        // Verify expectations
        expect( result ).toContain('mock data'); // works as it should

        // reset the expectations
        $httpBackend.resetExpectations();

        // set the fake data AGAIN
        $httpBackend.expectGET(url).respond(200, 'doof the magic cragwagon');

        // get the service AGAIN
        $http.get(url).success(successCallback);
        expect( result ).toContain('doof'); // does not work, result is original result
        console.log( result ); // logs 'mock data'

    }));

});

// --- Runner -------------------------
(function () {
    var jasmineEnv = jasmine.getEnv();
    jasmineEnv.updateInterval = 1000;

    var htmlReporter = new jasmine.HtmlReporter();

    jasmineEnv.addReporter(htmlReporter);

    jasmineEnv.specFilter = function (spec) {
        return htmlReporter.specFilter(spec);
    };

    var currentWindowOnload = window.onload;

    window.onload = function () {
        if (currentWindowOnload) {
            currentWindowOnload();
        }
        execJasmine();
    };

    function execJasmine() {
        jasmineEnv.execute();
    }

})();

Other things I've tried include adding an afterEach with resetExpectations (putting each request in a new it statement). and a slew of other random attempts. If it try to change the expected url to something not expected, it errors as it should-- so I know the requests are getting handled through httpBackend at the very least.

Is this a defect or am I implementing it incorrectly?

like image 571
FlavorScape Avatar asked Aug 18 '14 19:08

FlavorScape


People also ask

What is the use of backend and request expectations?

Backend definitions allow you to define a fake backend for your application which doesn't assert if a particular request was made or not, it just returns a trained response if a request is made. The test will pass whether or not the request gets made during testing. Request expectations Backend definitions Syntax .expect(...).respond(...)

How to specify what test data should be returned as HTTP responses?

There are two ways to specify what test data should be returned as http responses by the mock backend when the code under test makes http requests: $httpBackend.expect- specifies a request expectation

What is the use of resetexpectations () method?

resetExpectations(); Resets all request expectations, but preserves all backend definitions. Typically, you would call resetExpectations during a multiple-phase test when you want to reuse the same instance of $httpBackend mock.

What is the difference between respond and expectget methods?

The respond method returns the requestHandlerobject for possible overrides. expectGET(url, [headers], [keys]); Creates a new request expectation for GET requests.


1 Answers

The .resetExpectations() does work as you expected, but you just forgot to flush a http request for the second one.

// set the fake data AGAIN
$httpBackend.expectGET(url).respond(200, 'doof the magic cragwagon');

// get the service AGAIN
$http.get(url).success(successCallback);

$httpBackend.flush(); // flush the second http request here

expect( result ).toContain('doof'); // does not work, result is original result
console.log( result ); // logs 'mock data'

Example JSFiddle: http://jsfiddle.net/4aw0twjf/

PS. Actually, the $httpBackend.resetExpectations() is not necessary for your test case.

like image 123
runTarm Avatar answered Sep 27 '22 18:09

runTarm