async
sẽ không cho phép thử nghiệm tiếp theo bắt đầu cho đến khi async
kết thúc tất cả các nhiệm vụ của nó. Điều gì async
là bọc lệnh gọi lại trong một Vùng, nơi tất cả các tác vụ không đồng bộ (ví dụ setTimeout
) được theo dõi. Khi tất cả các tác vụ không đồng bộ đã hoàn tất, thì các tác vụ sẽ hoàn async
thành.
Nếu bạn đã từng làm việc với Jasmine bên ngoài Angular, bạn có thể đã thấy done
được chuyển đến cuộc gọi lại
it('..', function(done) {
someAsyncAction().then(() => {
expect(something).toBe(something);
done();
});
});
Đây, đây là Jasmine bản địa, nơi chúng tôi nói với Jasmine rằng bài kiểm tra này sẽ trì hoãn việc hoàn thành cho đến khi chúng tôi gọi điện done()
. Nếu chúng tôi không gọi done()
và thay vào đó đã gọi :
it('..', function() {
someAsyncAction().then(() => {
expect(something).toBe(something);
});
});
Kiểm tra sẽ hoàn thành ngay cả trước kỳ vọng, vì lời hứa sẽ giải quyết sau khi kiểm tra kết thúc thực hiện các tác vụ đồng bộ.
Với Angular (trong môi trường Jasmine), Angular sẽ thực sự gọi done
phía sau khi chúng ta sử dụng async
. Nó sẽ theo dõi tất cả các tác vụ không đồng bộ trong Zone và khi tất cả chúng hoàn thành, done
nó sẽ được gọi ở hậu trường.
Trong trường hợp cụ thể của bạn với TestBed
cấu hình, bạn sẽ sử dụng điều này nói chung khi bạn muốn compileComponents
. Tôi hiếm khi gặp phải tình huống mà tôi phải gọi nó theo cách khác
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyModule],
schemas: [NO_ERRORS_SCHEMA],
})
.compileComponent().then(() => {
fixture = TestBed.createComponent(TestComponent);
});
}));
Khi kiểm tra một thành phần sử dụng templateUrl
(nếu bạn không sử dụng webpack), thì Angular cần thực hiện một yêu cầu XHR để lấy mẫu, vì vậy việc biên dịch thành phần sẽ không đồng bộ. Vì vậy, chúng ta nên đợi cho đến khi nó giải quyết trước khi tiếp tục thử nghiệm.
async
không cần thiết. Khi bạn đang sử dụngtemplateUrl
, nó là. Tuy nhiên, việc bao gồmasync
sẽ không "phá vỡ" một thành phần mẫu nội tuyến. Bạn có nghĩ rằng có an toàn không khi nói rằng người ta có thể mặc định sử dụngasync
cho mọi bài kiểm tra?