programing

각도 테스트JS는 Jasmine 2.0에서 약속

closeapi 2023. 3. 12. 10:50
반응형

각도 테스트JS는 Jasmine 2.0에서 약속

재스민 2.0과 앵귤러에 머리를 싸매고 있는데JS가 약속합니다.알고 있습니다.

Angular를 테스트하려면JS는 Jasmine 2.0의 새로운 비동기 구문을 사용하여 약속합니다.

전화 후promise.resolve():

  • 호출합니다. 이렇게 하면 다이제스트 사이클이 강제로 실행되어 약속 해결이 전파됩니다.
  • 불러done()이것으로 재스민에게 비동기 테스트가 완료되었음을 알립니다.

다음은 예를 제시하겠습니다(Demo on Pluker).

describe('AngularJS promises and Jasmine 2.0', function() {
    var $q, $timeout;

    beforeEach(inject(function(_$q_, _$timeout_) {
        // Set `$q` and `$timeout` before tests run
        $q = _$q_;
        $timeout = _$timeout_;
    }));

    // Putting `done` as argument allows async testing
    it('Demonstrates asynchronous testing', function(done) {
        var deferred = $q.defer();

        $timeout(function() {
            deferred.resolve('I told you I would come!');
        }, 1000); // This won't actually wait for 1 second.
                  // `$timeout.flush()` will force it to execute.

        deferred.promise.then(function(value) {
            // Tests set within `then` function of promise
            expect(value).toBe('I told you I would come!');
        })
        // IMPORTANT: `done` must be called after promise is resolved
        .finally(done);

        $timeout.flush(); // Force digest cycle to resolve promises
    });
});

저 같은 경우에는$timeout.flush()잘 작동하지 않았지만 내 사양에 비동기 호출이 여러 개 있습니다.찾았다$rootScope.$apply(), 를 강제하기 위한 방법으로서digest각 비동기 콜에 대해서요.

describe('AngularJS promises and Jasmine 2.0', function () {
  beforeEach(inject(function (_$q_, _$timeout_, _$rootScope_) {
    $q = _$q_
    $timeout = _$timeout_
    $rootScope = _$rootScope_
  }))

  it('demonstrates asynchronous testing', function (done) {
    var defer = $q.defer()

    Async.call()
    .then(function (response) {
      // Do something

      var d = $q.defer()
      Async.call()
      .then(function (response) {
        d.resolve(response)
        $rootScope.$apply() // Call the first digest 
      })
      return d.promise
    })
    .then(function (response) {
      // Do something after the first digest

      Async.call()
      .then(function (response) {
        defer.resolve(response) // The original defer
        $rootScope.$apply() // Call the second digest
      })
    })

    defer.promise.then(function(value) {
      // Do something after the second digest
      expect(value).toBe('I told you I would come!')
    })
    .finally(done)

    if($timeout.verifyNoPendingTasks())
      $timeout.flush() 
  })
})

이것은 연쇄 비동기 호출과 같다.그게 대화에 도움이 됐으면 좋겠네요.안부 전해요

이 답변은 위의 답변에 새로운 내용을 추가하지는 않을 것입니다.그것은 단지, 나에게 있어서 효과가 있었던 것처럼, 보다 상세하게 답변을 표현하기 위한 것입니다.위의 질문에서 설명한 문제가 발생했을 때, 저는 모든 약속이 끝날 시간이 있고 모든 주장이 주장될 수 있는지 확인하는 방법을 찾기 위해 많은 시간을 투자했습니다.

제 경우, 저는 일련의 약속을 가지고 있었고, 각각의 약속 후에 결과가 제 기대와 일치하는지 확인해야 합니다.나는 그 어떤 약속도 만들지 않았다.deferred저는 오히려 기존의 것을 호출했습니다.

그래서 중요한 건$timeout.flush()저한테는 충분했어요.작업 테스트는 다음과 같습니다.

describe("Plain command without side-effects", function() {
    it("All usecases", inject(function($timeout) {
        console.log("All together");
        expect(state.number).toEqual(1);
        cmdHistory
            .execute(increaseState, decreaseState)
            .then(function() {
                console.log("Execute works");
                expect(state.number).toEqual(2);
                return cmdHistory.redo(); // can't redo, nothing's undone
            })
            .then(function() {
                console.log("Redo would not work");
                expect(state.number).toEqual(2);
                return cmdHistory.undo();
            })
            .then(function() {
                console.log("Undo undoes");
                expect(state.number).toEqual(1);
                return cmdHistory.undo();
            })
            .then(function() {
                console.log("Next undo does nothing");
                expect(state.number).toEqual(1);
                return cmdHistory.redo(); // but still able to redo

            })
            .then(function() {
                console.log("And redo redoes neatly");
                expect(state.number).toEqual(2);
            });

        $timeout.flush();
    }));

이 테스트는 commandHistory 객체가 정상적으로 동작하고 있는지 확인하기 위한 것입니다.이 테스트는 다음 작업을 수행합니다.execute그리고.unExecute, 및 3가지 방법:execute,undo,redo그 모든 것이 약속된 것이다.

없이.$timeout.flush()로그 출력에는All together더 이상의 로그 메시지는 없습니다.추가 중$timeout.flush()모든 것을 수정했습니다.이제 모든 메시지가 표시되며 모든 어설션이 실행됩니다.

업데이트 또 다른 옵션이 있습니다.약속하지 않고 테스트 스위트를 작성할 수 있습니다.then단, 각 약속이 호출된 후 플러싱하여 완료 여부를 확인합니다.

    it("All usecases 2", inject(function($timeout) {
        console.log("All usecases 2");
        expect(state.number).toEqual(1);

        console.log("Execute works");
        cmdHistory.execute(increaseState, decreaseState);
        $timeout.flush();
        expect(state.number).toEqual(2);

        console.log("Redo would not work");
        cmdHistory.redo(); // can't redo, nothing's undone
        $timeout.verifyNoPendingTasks();
        expect(state.number).toEqual(2);

        console.log("Undo undoes");
        cmdHistory.undo();
        $timeout.flush();
        expect(state.number).toEqual(1);

        console.log("Next undo does nothing");
        cmdHistory.undo();
        $timeout.verifyNoPendingTasks();
        expect(state.number).toEqual(1);

        console.log("And redo redoes neatly");
        cmdHistory.redo(); // but still able to redo
        $timeout.flush();
        expect(state.number).toEqual(2);
    }));

경우에 따라서는 제 방법이undo그리고.redo약속에 답하지 마라, 내가 전화한다.$timeout.verifyNoPendingTasks()대신flush그게 좋은지 나쁜지 말하기가 어렵죠

그러나 이 경우 테스트는 더 합리적이고 훨씬 단순해 보입니다.

언급URL : https://stackoverflow.com/questions/23131838/testing-angularjs-promises-in-jasmine-2-0

반응형