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
  • Chai 3.5.0

ответ

2

Похоже, что это нормальный поток исполнения после изучения деталей ошибки. После флеша (/ logout /) его перенаправление на домашний вид, который соответствует вашей логике маршрутизации проекта. Однако, когда он добрался до дома, он имеет какое-то отношение к API почтовых ящиков и ожидает еще одного моделирования httpbackend (GET).

Я считаю, что вы должны добавить еще одну строку в тестовом случае что-то подобное, как показано ниже

$httpBackend.whenGET('url').respond(200, { data: "ok"}); 
Смежные вопросы