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']);
});
});
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
@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
@estus, cải thiện nó và tước nó thành phố tối thiểu – deek