2017-10-03 26 views
14

Vì vậy, tôi đã tạo các kiểm tra đơn vị cho các thành phần của mình nhưng muốn một số dịch vụ riêng lẻ của tôi tách biệt. Tuy nhiên khi tôi cố gắng tiêm chúng (phương pháp dịch vụ đang được thử nghiệm không phải là không đồng bộ).Thử nghiệm đơn vị góc 2 Dịch vụ không chạy gọi lại sau khi tiêm

describe('SearchService',() => { 
    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       SearchService 
      ] 
     }); 

    }); 


    it("should build Url String",() => { 
     inject([SearchService], (searchService: SearchService) => { 
      spyOn(searchService, 'buildURL'); 
      console.log("should be logging like a boss"); 
      searchService.buildURL("test", "coursename", 2); 
      expect(searchService.buildURL).toHaveBeenCalled(); 
      expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']); 
      expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy(); 
     }); 
    }); 

}); 

Tiêm không bao giờ thực sự chạy gọi lại! kiểm tra nhận ra nó tuyên bố nhưng đi mà không có lỗi.

tuyên bố console.log bên trong không bao giờ chạy và kiểm tra được thiết kế để không vượt qua, vì vậy tôi giả định rằng quá trình tiêm không chạy được.

+0

Nếu nó không chạy, không nên có lỗi. Nếu bạn chắc chắn không có lỗi, vui lòng cung cấp http://stackoverflow.com/help/mcve. – estus

+0

@estus Không có lỗi. Trong thực tế, toàn bộ thử nghiệm trôi qua với màu sắc bay. Tôi có thể giao diện điều khiển đăng nhập bên ngoài của tiêm nhưng bên trong console.log không bao giờ chạy. – deek

+0

@estus, cải thiện nó và tước nó thành phố tối thiểu – deek

Trả lời

2

Bạn chỉ cần lồng 1 thêm clojure và đó là lý do tại sao nó sẽ không hoạt động.

it("should build Url String",() => { 
     inject([SearchService], (searchService: SearchService) => { 
      spyOn(searchService, 'buildURL'); 
      console.log("should be logging like a boss"); 
      searchService.buildURL("test", "coursename", 2); 
      expect(searchService.buildURL).toHaveBeenCalled(); 
      expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']); 
      expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy(); 
     }); 
    }); 

Thay đổi nó như dưới đây để làm cho nó hoạt:

it("should build Url String", inject([SearchService], (searchService: SearchService) => { 
      spyOn(searchService, 'buildURL'); 
      console.log("should be logging like a boss"); 
      searchService.buildURL("test", "coursename", 2); 
      expect(searchService.buildURL).toHaveBeenCalled(); 
      expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']); 
      expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy(); 
    }) 
); 

Lý do là, kể từ khi bạn thực hiện inject trong clojure khác nó sẽ thực hiện nó trong phạm vi khác, tham số thứ 2 của it phải là một với chức năng kiểm tra nhưng vì bạn đã chuyển vào một ô trống clojure, nó sẽ chỉ giải quyết thành true.

Dưới đây là một ví dụ về những gì đang xảy ra:

() => { // calling this clojure it will return null/undefined 
() => { // calling this clojure it will return '1' 
    return '1'; 
    } 
} 
3

EDIT: 2 thêm ví dụ đầy đủ về cách kiểm tra Đơn vị dịch vụ 2/4 góc với dữ liệu cuống cuộc gọi HTTP thay thế ví dụ ban đầu. Ví dụ tuyệt vời của đơn vị thử nghiệm một dịch vụ IMO hơi khác với hướng dẫn chính thức và bên thứ ba.

EDIT: đọc lại hướng dẫn chính thức và sau @ AnteJablanAdamović trong các ý kiến ​​trên chỉ ra nó là nghĩa vụ phải được

it('should tell ROUTER to navigate when hero clicked', 
    inject([Router], (router: Router) => { // ... 
})); 

https://angular.io/guide/testing#the-inject-function

Tôi không chắc chắn nếu bạn có thể bọc nó trong một fakeasync (tại sao không?) hoặc async như một cuộc gọi trở lại nhưng đây là câu trả lời đúng cho câu hỏi ban đầu của tôi (làm thế nào không ai con số này ra với một 50 + bounty và 10 + upvotes ?!).

Tuy nhiên, chiến lược dưới đây là cách làm sạch hơn/nhanh hơn để thực hiện IMO này thay vì dán vào mỗi câu "nó" bằng cách đưa nó vào BeforeEach;

Đó là một sự xấu hổ Karma hoặc góc không ném bất kỳ lỗi hoặc cảnh báo cờ.

Dưới đây là câu trả lời ban đầu tôi cung cấp nhưng cũng hoạt động như một cách thay thế:


tôi đã sử dụng testBet.get để tiêm dịch vụ trong beforeEarch: Tốt hơn nhiều so với những gì hầu hết các hướng dẫn đề nghị IMO.

Hãy xem hướng dẫn này nếu có dịch vụ vấn đề thử nghiệm của bạn: bao gồm các dịch vụ đơn giản hay phức tạp với phụ thuộc:

http://www.kirjai.com/testing-angular-services-with-dependencies/

describe('SearchService',() => { 
// IMPORTANT - declase variables we'll set in before each so every "it statement // can reach them 

    let searchService: SearchService; 
    let backend: MockBackend; 
    let setupConnections; 


     class MockActivatedRoute extends ActivatedRoute { 
      constructor() { 
       super(); 
       this.params = Observable.of({ 'searchterm': '*', 'sorttype': 'relevant', 'pagenumber': 1, 'facet': '' }); 
      } 
     } 
     const MockRouter = { 
      navigate: (x) => ({ 
       then:() => ({}) 
      }) 
     }; 
     beforeEach(() => { 
      TestBed.configureTestingModule({ 
       imports: [HttpModule], 
       providers: [ 
// below required for HTTP substitution testing 
        MockBackend, 
        BaseRequestOptions, 
        { 
         provide: Http, 
         useFactory: (backend: MockBackend, options: BaseRequestOptions) => new Http(backend, options), 
         deps: [MockBackend, BaseRequestOptions] 
        }, 
        AnalyticsService, 
        { provide: ActivatedRoute, useClass: MockActivatedRoute }, 
        { 
         provide: Router, 
         useValue: MockRouter 
        }, 
        SearchService 
       ] 
      }); 

// set our values in before each and use Testbed to inject services 
     searchService = TestBed.get(SearchService); 
     backend = TestBed.get(MockBackend); 

bạn có thể đặt đường dẫn với câu lệnh if như trong hướng dẫn đăng ký tài khoản cho setupConnections nhưng trừ khi bạn làm điều gì đó bất thường với một cuộc gọi, bạn không cần phải có đường dẫn phù hợp để điều này là tốt

setupConnections = (backend: MockBackend, options: any) => { 
      backend.connections.subscribe((connection: MockConnection) => { 
       const responseOptions = new ResponseOptions(options); 
       const response = new Response(responseOptions); 
       connection.mockRespond(response); 
      }); 
     }; 

     }); 

Lưu ý async không phải là fakeAsync !!!! Thông thường tôi sử dụng fakeAsync tốt trong kiểm tra đơn vị thành phần nhưng tôi có một số lỗi làm điều này khi đơn vị kiểm tra các dịch vụ này theo cách này, YMMV

it('should get suggestions for search drop down and match of mock results for test', async(() => { 
     console.log('running get Suggestions'); 
// here we set out HTTP data response stub: put return data in body 
     setupConnections(backend, { 
      body: { 
       suggestions: 
       ["6-minute walk test", 
      }, 
      status: 200 
     }); 
// resolve HTTP call with subscribe and do test in call back. 
     searchService.getSuggestions('test').subscribe((x) => { 
      console.log(x); 
      expect(x).toEqual(['6-minute walk test']); 
     }); 

    }); 
Các vấn đề liên quan