programing

$httpBackend 조롱 - "예기치 않은 요청, 더 이상 예상되지 않은 요청" 처리 방법

minimums 2023. 4. 3. 21:22
반응형

$httpBackend 조롱 - "예기치 않은 요청, 더 이상 예상되지 않은 요청" 처리 방법

재스민 테스트는 다음과 같이 코드화되어 있습니다.

  it ("should send correct message to server to get data, and correctly set up scope when receiving it", function(){
    $httpBackend.when('GET', 'https://localhost:44300/api/projectconfiguration/12').respond(fakedDtoBase);
    $routeParams.projectId=fakeId; // user asks for editing project
    scope.$apply(function(){
        var controller=controllerToTest(); // so controller gets data when it is created
    });
    expect(scope.projectData).toEqual(fakedDtoBase);
});

작동하지만 오류가 발생합니다.

Error: Unexpected request: GET views/core/main/main.html
No more request expected
    at $httpBackend (C:/SVN/src/ClientApp/client/bower_components/angular-mocks/angular-mocks.js:1207:9)
    at sendReq (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7800:9)
    at $http.serverRequest (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7534:16)
    (more stack trace)....

나는 내가 다른 모든 전화를 조롱할 수 있다는 것을 깨달았다.다만, 다른 것은 거의 할 수 없기 때문에, 그 밖에 무엇을 로드하고 싶은지 신경 쓰지 않는다고 합시다.다른 모든 요청이 "사일런트하게" 이루어지도록 하고, 다른 모든 요청에 대해 단일 더미 응답을 제공할 수 있도록 하려면 어떻게 해야 합니까?

사용자가 지정하지 않은 요청이 이루어졌기 때문에 테스트가 실패합니다.

추가 시도:

$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);

물론, 다음 명령어를 정의해야 합니다.fakedMainResponse.

또한 다음 내용이 기재된 문서(요청 예상과 백엔드 정의 섹션)를 참조하십시오.

요청 예상은 응용 프로그램에 의해 수행된 요청에 대해 어설션을 수행하고 이러한 요청에 대한 응답을 정의하는 방법을 제공합니다.예상된 요구가 이루어지지 않거나 잘못된 순서로 이루어지면 테스트는 실패합니다.

의 두 번째 파라미터$httpBackend.when실제로는RegExp. 그래서 만약 당신이RegExp동작해야 할 다른 모든 요구와 일치합니다.

EndToEnd 테스트에서 httpBackend를 사용하여 http 콜을 조롱하거나 응용 프로그램의 http 콜 전체를 조롱하는 경우 해결 방법은 앱 구성 섹션에 다음 코드를 추가하는 것입니다(템플릿 위치에 따라 regexp를 변경).

$httpBackend.whenGET(/^\/templates\//).passThrough();

참고 자료: https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend

angularjs 1.4로 테스트하여 UI 라우터를 통합하면서 동일한 문제를 해결

또 중요한 건, 만약 당신이 이 문제를 가지고 있다면$digest(), 당신의 예상은 다음에 이어져야 합니다.$digest다음과 같은 경우:

_$rootScope_.$digest();
$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);
// ...
$httpBackend.flush(); // And remember to flush at the end

setTimeout을 추가하고done그것을 방지하기 위해 당신의 플러시에 대한 재산

it('should get data in callback funcion', function (done) {
    $httpBackend.whenGET(/\/my-endpoint/).respond(mockDataResponse);

    apiFactory.getCurrencyFormat('en', function (res, err) {
        expect(res.a).to.deep.equal(generalMock.a);
        expect(res.b).to.deep.equal(generalMock.b);
    });

    setTimeout(function () {
        done();
        $httpBackend.flush();
    }, 200);
});

언급URL : https://stackoverflow.com/questions/22405085/mocking-httpbackend-how-to-handle-unexpected-request-no-more-request-expect

반응형