각도 테스트JS는 Jasmine 2.0에서 약속
재스민 2.0과 앵귤러에 머리를 싸매고 있는데JS가 약속합니다.알고 있습니다.
- Jasmine 2.0은 이전 버전을 대체하는 기능을 도입했습니다.
runs
그리고.waitsFor
기능들 - 각도 JS
$q
다이제스트 사이클이 트리거될 때까지 약속은 해결되지 않습니다.
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
'programing' 카테고리의 다른 글
레일 3: Ajax 콜에서 "redirect_to"를 하려면 어떻게 해야 합니까? (0) | 2023.03.17 |
---|---|
카테고리를 제품 woocomme로 설정하는 방법 (0) | 2023.03.17 |
http post 요청의 요청 페이로드에 json 데이터를 전달하는 방법 (0) | 2023.03.12 |
X-Sendfile 헤더가 작동하는지 테스트합니다. (0) | 2023.03.12 |
AngularJS - 커스텀 디렉티브에서 ngModel 값을 변경하는 방법 (0) | 2023.03.12 |