我已经尝试并尝试使它起作用。 documentation很简洁,充其量:

resetExpectations(); -重置所有请求期望,但保留所有后端定义。通常,当您想重用$ httpBackend模拟的相同实例时,可以在多阶段测试期间调用resetExpectations。

每次我的第二个请求被调用时,我的结果始终具有第一个结果的数据。 check out 这个 fiddle http://jsfiddle.net/tbwn1gt0/2/,我在第一次刷新后在其中重置了期望值,然后设置了新的期望值/结果,然后再次刷新以产生不正确的数据。

// --- 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();
    }

})();

我尝试过的其他方法包括添加带有resetExpectations的afterEach(将每个请求放入新的it语句中)。以及大量其他随机尝试。如果它尝试将预期的url更改为意外的内容,则会出现应有的错误-因此,我知道请求至少是通过httpBackend处理的。

这是缺陷还是我实现不正确?

最佳答案

.resetExpectations()确实可以按预期工作,但是您只是忘记刷新第二个请求的http请求。

// 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'

示例JSFiddle: http://jsfiddle.net/4aw0twjf/

PS。实际上,您的测试用例不需要$httpBackend.resetExpectations()

关于javascript - 如何实际重置$ httpBackend期望?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25370273/

10-12 07:03