1 Jasmine thử nghiệm dịch vụ nhà nước

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi chưa quen với thử nghiệm Jasmine và đang tìm kiếm một "thực tiễn tốt nhất" để thử nghiệm đơn vị dịch vụ AngularJS có trạng thái. Hầu hết các hướng dẫn tôi có thể tìm thấy tập trung vào các trường hợp thử nghiệm chạy các cuộc gọi nguyên tử đến các dịch vụ phi trạng thái.

Điều này khớp với cú pháp Jasmine

it("should do something", function(){ expect(target.doSomething()).toBe... })

Tuy nhiên, tôi không tìm thấy cách rõ ràng nào để mở rộng mẫu này sang trường hợp thử nghiệm liên quan đến nhiều cuộc gọi đến một hoặc một số chức năng của dịch vụ.

Hãy tưởng tượng một dịch vụ như thế này:

angular.module("someModule").factory("someService", function(){
  return { 
    enqueue: function(item){
      // Add item to some queue
    }
  }
});

Đối với một dịch vụ như vậy, sẽ rất hợp lý khi kiểm tra các cuộc gọi tuần tự đến enqueue() xử lý các mục theo đúng thứ tự. Điều này liên quan đến việc viết một trường hợp thử nghiệm gọi enqueue() nhiều lần và kiểm tra kết quả cuối cùng (điều này rõ ràng không thể đạt được với một dịch vụ đơn giản như ở trên, nhưng đây không phải là điểm ...)

Điều gì không hoạt động:

describe("Some service", function(){
  // Initialization omitted for simplicity
  it("should accept the first call", function() { 
    expect(someService.enqueue(one)).toBe... // whatever is correct 
  });
  it("should accept the second call", function() { 
    expect(someService.enqueue(two)).toBe... // whatever is correct 
  });
  it("should process items in the correct order", function() { 
    // whatever can be used to test this
  });
});

Mã ở trên (thực sự xác định không phải một mà là ba trường hợp thử nghiệm) thất bại ngẫu nhiên vì ba trường hợp thử nghiệm được thực thi ... chỉ là ngẫu nhiên.

Một poster trong chủ đề này đã đề xuất rằng việc chia mã thành nhiều khối describe sẽ được thực hiện theo thứ tự nhất định, nhưng một lần nữa điều này dường như khác với phiên bản Jasmine này với phiên bản khác (theo các áp phích khác trong cùng một chủ đề). Hơn nữa, thực hiện các bộ và kiểm tra theo thứ tự ngẫu nhiên dường như là cách dự định; ngay cả khi có thể, bằng cách thiết lập, để ghi đè hành vi này, đó có thể KHÔNG phải là cách đúng đắn.

Vì vậy, dường như cách duy nhất đúng để kiểm tra kịch bản nhiều cuộc gọi là biến nó thành MỘT trường hợp thử nghiệm, như thế này:

describe(("Some service", function(){
  // Initialization omitted for simplicity
  it("should work in my complex scenario", function(){
    expect(someService.enqueue(one)).toBe... // whatever is correct 
    expect(someService.enqueue(two)).toBe... // whatever is correct 
    expect(/* whatever is necessary to ensure the order is correct */);
  });
});

Mặc dù về mặt kỹ thuật, đây có vẻ là cách hợp lý (xét cho cùng, một kịch bản phức tạp là một trường hợp thử nghiệm không phải ba), mẫu "mô tả + mã" của Jasmine dường như bị xáo trộn trong quá trình triển khai này như:

  • Không có cách nào để liên kết một tin nhắn với từng "bước phụ" có thể thất bại trong trường hợp thử nghiệm;
  • Mô tả cho một "nó" chắc chắn là cồng kềnh, như trong ví dụ ở trên, để thực sự nói điều gì đó hữu ích về một kịch bản phức tạp.

Điều này khiến tôi tự hỏi liệu đây có phải là giải pháp chính xác duy nhất (hoặc là nó không?) cho loại nhu cầu thử nghiệm này. Một lần nữa, tôi đặc biệt quan tâm đến việc "thực hiện đúng cách" hơn là sử dụng một loại hack nào đó sẽ khiến nó hoạt động ... nơi không nên.

    
0
1 Câu trả lời                              1                         

Xin lỗi, không có mã nào cho việc này ... Không chắc là nó cần, tôi nghĩ bạn chỉ cần điều chỉnh kỳ vọng về các bài kiểm tra của mình.

Đối với quy tắc thử nghiệm chung, bạn không thực sự quan tâm đến việc phụ thuộc bên ngoài xử lý dịch vụ như thế nào, bạn không thể kiểm soát điều đó. Bạn muốn kiểm tra những gì bạn nghĩ rằng kết quả mong đợi sẽ dành cho dịch vụ của bạn.

Ví dụ của bạn, bạn sẽ chỉ muốn gọi các phụ thuộc cho dịch vụ của mình và gọi hàm và kiểm tra kết quả mong đợi là gì khi gọi hàm enqueue. Nếu nó trả lại một lời hứa, kiểm tra thành công và lỗi. Nó gọi một kiểm tra API và vân vân.

Nếu bạn muốn xem các phụ thuộc bên ngoài sử dụng dịch vụ của bạn như thế nào, bạn sẽ kiểm tra nó trong các thử nghiệm phụ thuộc đó.

Ví dụ: bạn có bộ điều khiển gọi enqueue. Trong thử nghiệm, bạn sẽ phải tiêm nhà cung cấp dịch vụ của mình (dịch vụ). Và xử lý các kỳ vọng.

    
0
2019-05-08 19: 54: 34Z
nguồn đặt đây