1

라우팅 활성화됩니다 나는 다음과 같은 서비스를 테스트하려면 :

"use strict"; 

const BASE_API = APP_CONF.baseApi; 

export default function() { 
    "ngInject"; 

class API { 

constructor() { 
    this.loading = false; 
} 

logout() { 
    this.loading = true; 

    return $http.post(`${BASE_API}/logout`) 
    .then(res => { 
     this.loading = false; 

     return res.data; 
    }, err => { 
     this.loading = false; 

     throw err; 
    }); 
} 
} 

return new API(); 

}; 

내 시험 :

"use strict"; 

let baseApi = APP_CONF.baseApi; 

describe("Auth service", function() { 
let Auth; 

beforeEach(angular.mock.module("app")); 

beforeEach(angular.mock.inject(function(_Auth_) { 
    Auth = _Auth_; 
})); 

context("method LOGOUT", function() { 
    let $httpBackend; 

beforeEach(angular.mock.inject(function(_$httpBackend_) { 
    $httpBackend = _$httpBackend_; 
    $httpBackend.whenPOST(`${baseApi}/logout`).respond(200, { data: "ok"}); 
})); 

it("should change 'loading' flag", function() { 
    Auth.logout(); 
    assert.isTrue(Auth.loading); 
    $httpBackend.flush(); 
    assert.isFalse(Auth.loading); 
}); 

}); 
}); 

하지만 내 테스트는 다음과 같은 오류와 함께 실패합니다

Chrome 51.0.2704 (Linux 0.0.0) Auth service method LOGOUT should change 'loading' flag FAILED 
    Error: Unexpected request: GET http://localhost:3000/api/mailboxes 
    No more request expected 

이 요청은 경로가 확인 된 후에 호출됩니다.

"use strict"; 

export function config($locationProvider, $stateProvider, $urlRouterProvider) { 
    "ngInject"; 

    $urlRouterProvider.otherwise("404"); 
    $locationProvider.html5Mode(true); 

    $stateProvider 
    .state("404", { 
    url: "/404", 
    template: `<view-404 class="v-404" />` 
    }) 
    .state("home", { 
     url: "/", 
     template: `<view-home class="v-home" />`, 
     resolve: { 
     mailboxes: function(MailboxesApi, MailboxesStore, $state) { 
     "ngInject"; 

     return MailboxesApi.getAll() // THIS LINE ACTIVATES UNEXPECTED REQUEST 
     .then(mailboxes => { 
      MailboxesStore.set(mailboxes); 

      let inbox = MailboxesStore.getByName("inbox"); 

      if (inbox) { 
      $state.go("cabinet.mailbox", { mailboxid: inbox._id }); 
      } else { 
      $state.go("cabinet.mailbox", { mailboxid: MailboxesStore.getByIndex(0)._id }); 
      } 
     }); 
     } 
    } 
    }); 

    }; 

    export function run($transitions) { 
    "ngInject"; 

    $transitions.onError({ to: "*" }, (ErrorHandler, $error$) => { 
    "ngInject"; 

    ErrorHandler.handle($error$); 
    }); 

    }; 

내 테스트에서 $ httpBackend.flush()가 호출 된 후 '집'상태가 활성화 된 것으로 나타났습니다. 왜 그렇게됩니까?

내 의존성 :

  • 각-망신 시켰 1.5.7
  • 각도 1.5.6
  • 각-UI-라우터 1.0.0-alpha.5
  • 카르마 0.13.22
  • 모카 2.5.3
  • 차이 3.5.0

답변

2

오류 세부 정보를 살펴본 후 정상적인 실행 흐름 인 것처럼 보입니다. 프로젝트 라우팅 논리에 따라 홈 뷰로 리디렉션 한 후 플러시 (/ 로그 아웃 /)합니다. 그러나 집에 도착했을 때 메일 함 API와 기대되는 또 다른 httpbackend (GET) 시뮬레이션과 관련이 있습니다.

난 당신이 같은 테스트 케이스에 비슷한 또 하나의 줄을 추가한다고 생각

$httpBackend.whenGET('url').respond(200, { data: "ok"}); 
아래