7

我已经尝试并试图让它发挥作用。文档很简洁,充其量是:

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

每次调用我的第二个请求时,我的结果总是包含第一个结果的数据。查看这个小提琴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 处理的。

这是一个缺陷还是我执行不正确?

4

3 回答 3

4

确实可以按您的.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()对于您的测试用例来说,这不是必需的。

于 2014-08-18T19:13:40.937 回答
1

您的案例不需要重新设定期望。您可以修改期望行为,而不是清除并创建新行为。“expectGET”(和其他方法)返回 requestHandler,例如:

// Create expectation
var expectationHandler = $httpBackend.expectGET(url).respond(200, 'mock data');

// Call http service, flush response, verify expectations

// Modify behavior
expectationHandler.respond(200, 'doof the magic cragwagon');

// Call http service ... AGAIN
于 2017-05-17T10:22:31.397 回答
0

由于您有多个调用,我将在每次测试结束时使用它来验证所有 http 调用是否成功expect($httpBackend.flush).not.toThrow();,这意味着您不必$httpBackend.flush();为每个 http 调用调用。

此外,您很高兴添加这样的afterEach块。

afterEach(function () {
    $httpBackend.verifyNoOutstandingExpectations();
});
于 2015-12-16T12:58:27.237 回答