Andrey (azangru) wrote,
Andrey
azangru

Вопль

Пишу для ангулярского контроллера тест. Допустим, дурацкий, но все-таки. Тестируется асинхронное событие. Контроллер вызовет функцию и через некоторое время в scope этого контроллера будет

$scope.member = {что-то-там-внутри};

Контроллер зависит от фабрики Home, у которой есть функция getMember. Она асинхронная. Делаю мок этой функции:

var Home = {
  getMember: function(id){
    return Promise.resolve({
      "id":300065,
      "firstname":"John",
      "lastname":"Smith"
    });
  }
};


Перехожу к тесту (в Mocha). Мока, как про нее пишут, умеет обращаться с асинхронными функциями. Ну, я, значит, и пишу:

it("assigns an object to $scope.member", function(done){
  Home.getMember(1).then(function(result){
    expect(scope.member).to.eql({
      "id":300065,
      "firstname":"John",
      "lastname":"Smith"
    });
    done();
    });
});


И — фиг. Не работает — пишет: "Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test". Хотя я вызываю этот done callback. Более того, если вместо Home.getMember(1) написать Promise.resolve(1) (просто чтобы обещание создалось), то вот так работает:

it("assigns an object to $scope.member", function(done){
  Promise.resolve(1).then(function(result){
    expect({a: 1}).to.eql({a: 1});
    done();
   });
});



а вот так — ругается на тот же самый таймаут:

it("assigns an object to $scope.member", function(done){
  Promise.resolve(1).then(function(result){
    expect(scope.member).to.eql({a: 1});
    done();
  });
});


Откуда у Моки проблема с ангулярской scope (которая $scope), почему она ругается — ума не приложу.

Не то чтобы тест был важный, да и переписался он с использованием chai-as-promised, но елки-палки, как такое может быть, что с одним объектом — {a: 1} — тест работает, а с другим — scope.member — вылетает и жалуется на то, что коллбэк не вызвали.
Subscribe

  • (no subject)

    Thought of this phrase today for some reason, then thought whether it exists in English (putting toothpaste back into the tube came to mind), then…

  • (no subject)

    I think many (perhaps most) people are totally fine with being a free-rider, a bludger, or a sponge (remember Trump who said that he pays little…

  • (no subject)

    Someone who self-identifies as a technical writer, among other things, begins her article How To Build An E-Commerce Site With Angular 11, Commerce…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments

  • (no subject)

    Thought of this phrase today for some reason, then thought whether it exists in English (putting toothpaste back into the tube came to mind), then…

  • (no subject)

    I think many (perhaps most) people are totally fine with being a free-rider, a bludger, or a sponge (remember Trump who said that he pays little…

  • (no subject)

    Someone who self-identifies as a technical writer, among other things, begins her article How To Build An E-Commerce Site With Angular 11, Commerce…