2016-05-30 21 views
6

Cách dễ nhất để giả lập phản hồi được trả về bởi Httpget() trong Góc 2 là gì?Góc 2 mô hình Http get() để trả lại tệp json cục bộ

Tôi có tệp data.json cục bộ trong thư mục đang hoạt động của mình và tôi muốn get() trả về phản hồi chứa dữ liệu đó dưới dạng tải trọng, mô phỏng api còn lại.

Tài liệu để định cấu hình đối tượng Backend cho Http dường như hơi mơ hồ và quá phức tạp cho một tác vụ đơn giản như vậy.

+0

Không biết tại sao bạn nghĩ rằng cấu hình 'Backend' bị che khuất. DI là một khối xây dựng chính và cơ bản của Angular2 và đây chính là trường hợp sử dụng DI được tạo ra. Có gì phức tạp với 'MockBackend, cung cấp (XHRBackend, {useExisting: MockBackend})'. Nó đơn giản và thẳng thắn. –

+0

@ GünterZöchbauer Các kỹ sư phần mềm có nhiều loại khác nhau. Chỉ vì một cái gì đó rất dễ dàng cho 50 phần trăm đầu, không làm cho nó dễ dàng cho phía dưới 50. Nó không bao giờ tốt để được như vậy miễn nhiệm POV của người khác mà không thực sự được trong giày của họ. –

+1

@KaMok Nhận xét của tôi không phải là bất lợi. Nếu ai đó muốn một giải pháp, anh ta cần cung cấp thông tin về vấn đề là gì. Đó là nhận xét của tôi về. "Tài liệu để cấu hình đối tượng Backend cho Http có vẻ hơi mơ hồ và quá phức tạp cho một nhiệm vụ đơn giản như vậy." chỉ là vô dụng ranting. Nếu anh ta đã cung cấp một liên kết hoặc đăng mã mà anh ta tìm thấy quá phức tạp thì có gì đó để thảo luận, nhưng theo cách của nó, nó không thực sự là một câu hỏi. Tôi chỉ cố gắng tìm thêm thông tin. –

Trả lời

2

Bạn cần ghi đè nhà cung cấp XhrBackend với số MockBackend. Sau đó, bạn cần tạo một trình phun khác để có thể thực thi một yêu cầu HTTP đúng.

Đây là một mẫu:

beforeEachProviders(() => { 
    return [ 
    HTTP_PROVIDERS, 
    provide(XHRBackend, { useClass: MockBackend }), 
    SomeHttpService 
    ]; 
}); 

it('Should something', inject([XHRBackend, SomeHttpService], (mockBackend, httpService) => { 
    mockBackend.connections.subscribe(
    (connection: MockConnection) => { 
     var injector = ReflectiveInjector.resolveAndCreate([ 
     HTTP_PROVIDERS 
     ]); 
     var http = injector.get(Http); 
     http.get('data.json').map(res => res.json()).subscribe(data) => { 
     connection.mockRespond(new Response(
      new ResponseOptions({ 
      body: data 
      }))); 
     }); 
    }); 
})); 
+1

sau khi nghiên cứu tôi tìm thấy câu trả lời là MUCH đơn giản hơn: chỉ cần sử dụng vị trí của tệp json cục bộ (app/data.json) làm url thay vì địa chỉ http –

+0

Tuyệt vời! Quan tâm đến việc có thêm chi tiết ;-) Yêu cầu thực sự được thực hiện như thế nào? –

+0

@ThierryTemplier yêu cầu được thực thi giống như bất kỳ yêu cầu GET nào từ một máy chủ thực, nhưng đối với các thủ tục sắc thái hơn, như kiểm tra hành vi trên các yêu cầu không thành công hoặc yêu cầu PUT sẽ cần MockBackend. –

1

Bằng cách này, bạn cần phải thử các XHRBackend và cung cấp dữ liệu chế giễu trong một lớp học với phương pháp createDb. Phương thức createDb trả về đối tượng JSON được mô phỏng. Để tải dữ liệu đó cung cấp chính xác ví dụ URL đến http.get, nếu đối tượng JSON được chứa trong một biến mockedObject, thì URL phải là "app\mockedObject".

Bạn có thể đọc thêm chi tiết tại đây: https://angular.io/docs/ts/latest/guide/server-communication.html.

0

Bạn có thể sử dụng HttpTestingController sẵn thông qua Testbed lõi như với tôi nó cảm thấy trực quan hơn (mỗi sở hữu của họ, tất nhiên). Untested snippet:

import { TestBed, async } from '@angular/core/testing'; 
import { HttpTestingController } from '@angular/common/http/testing'; 

import { MyApiService } from './my-api.service'; 

export function main() { 
    describe('Test set',() => { 
    let httpMock: HttpTestingController; 

    beforeEach(() => { 

     TestBed.configureTestingModule({ 
     imports: [], 
     providers: [MyApiService] 
     }); 

     httpMock = TestBed.get(HttpTestingController); 
    }); 

    it('should call get', async(() => { 

     const data: any = {mydata: 'test'}; 
     let actualResponse: any = null; 
     MyApiService.get().subscribe((response: any) => { 
     actualResponse = response; 
     }); 

     httpMock.expectOne('localhost:5555/my-path').flush(data); 
     expect(actualResponse).toEqual(data); 

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