Tôi khá mới với Angular và tôi đang làm việc để kiểm tra dịch vụ Angular chạy dịch vụ cấp API kết thúc một loạt các cuộc gọi tới dịch vụ REST. Bởi vì nó đang làm việc với các yêu cầu HTTP, cả hai phần của dịch vụ đang làm việc với các lời hứa và dường như nó hoạt động tốt, nhưng tôi gặp khó khăn trong việc kiểm tra các hành vi đã hứa.Thử nghiệm Jasmine cho dịch vụ Angular không giải quyết cuộc gọi hoãn lại
Phần liên quan của mã dịch vụ của tôi (hiển nhiên đơn giản hóa) trông như thế này:
angular.module('my.info')
.service('myInfoService', function (infoApi, $q) {
infoLoaded: false,
allInfo: [],
getInfo: function() {
var defer = $q.defer();
if (infoLoaded) {
defer.resolve(allInfo);
} else {
infoApi.getAllInfo().then(function (newInfo) {
allInfo = newInfo;
infoLoaded = true;
defer.resolve(allInfo);
});
}
return defer.promise;
}
});
Khi tôi đang thiết lập mô hình của tôi, tôi có một cái gì đó như thế này:
describe("Info Service ",
function() {
var infoService, infoRequestApi, $q;
beforeEach(module("my.info"));
beforeEach(function() {
module(function($provide) {
infoRequestApi = {
requestCount: 0,
getAllInfo: function() {
var defer = $q.defer();
this.requestCount++;
defer.resolve([ "info 1", "info 2" ]);
return defer.promise;
}
};
$provide.value("infoApi", infoRequestApi);
});
inject(function(_myInfoService_, _$q_) {
infoService = _myInfoService_,
$q = _$q_;
});
});
it("should not fail in the middle of a test", function(done) {
infoService.getInfo().then(function(infoResult) {
// expectation checks.
expect(true).toBeTrue();
}).finally(done);
});
});
Bất kỳ kiểm tra đồng bộ vượt qua tốt, nhưng khi tôi cố gắng chạy bất kỳ bài kiểm tra nào như thế này, tôi nhận được thông báo cho biết: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Dường như là có điều gì đó về cách mà Angular.Moc ks xử lý kết quả trì hoãn là làm cho nó thất bại. Khi tôi trải qua bài kiểm tra, biến số defer
của đối tượng giả được đặt chính xác, nhưng tuyên bố then
trong dịch vụ sẽ không bao giờ được gọi. Tôi làm sai ở đâu?
Cảm ơn bạn đã tăng gấp đôi, cả câu trả lời hay và đề xuất tái cấu trúc. Tôi nghi ngờ rằng cách tiếp cận chế nhạo là một chút dài gió! Vấn đề duy nhất tôi có bây giờ là có vẻ như nếu tôi có một vài lớp dịch vụ, có vẻ như tôi cần phải tiêm một mô hình cho mọi nhà xây dựng theo đúng cách, nhưng điều này là gọn gàng hơn và thành ngữ hơn. – glenatron
@glenatron Không sao cả. Bạn chỉ cần giả lập các phụ thuộc được sử dụng trong dịch vụ đang được kiểm tra. Bạn không cần phải giả lập phụ thuộc của họ, do đó, các câu hỏi của lớp là tranh luận. –
Bạn đã chính xác, tôi đã thực sự gặp sự cố với thử nghiệm Chutzpah cho Visual Studio, điều này đã gây ra lỗi thất bại. Các bài kiểm tra tương tự cũng hoạt động tốt dưới các trình chạy thử khác. – glenatron