Служба тестирования: разница между методом MockBackend и методом spyOn(). And.returnValue()

Эти два теста, кажется, работают (по крайней мере, в моем случае)

Существуют ли какие-то конкретные различия между этими двумя методами? И как решить, что мне следует использовать (лучшие практики для тестирования службы с использованием Http)?

1. Использование метода MockBackend

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [
      MyService,
      MockBackend,
      BaseRequestOptions,
      {
          provide: Http,
          deps: [MockBackend, BaseRequestOptions],
          useFactory: (backend: XHRBackend, defaultOptions: BaseRequestOptions) => new Http(backend, defaultOptions)
      }
    ],
    imports: [HttpModule]
  }).compileComponents();
});

it('#getResources should get an items list', 
  async(inject([MyService], (service: MyService) => {

    TestBed.get(MockBackend).connections.subscribe(
        (connection: MockConnection) => connection.mockRespond(new Response(
          new ResponseOptions({
            body: {
              items: ['foo','bar']
            }
          })
        ))
    );

    service.getResources('/foobar').subscribe(items => {
        expect(items).toEqual(['foo','bar']);
    });

  }))
);

2. Использование метода spyOn(). And.returnValue()

let backend: XHRBackend;
let defaultOptions: BaseRequestOptions;
let http = new Http(backend, defaultOptions);

it('#getResources should get an items list', async(() => {

  const spy = spyOn(http, 'get')
              .and.returnValue(
                Observable.of(new Response(new ResponseOptions({
                    body: {items: ['foo','bar']}
                }))
              ));

  let service = new MyService(http);
  service.getResources('/foobar').subscribe(items => {
    expect(items).toEqual(['foo','bar']);
  });

}));

1 ответ

Решение

Использовать MockBackend потому что могут быть и другие вещи, которые вы, вероятно, должны также проверить, например, что URL-адрес правильный, что добавлены правильные заголовки и т. д. Все эти вещи можно получить из Request от MockConnection

TestBed.get(MockBackend).connections
 .subscribe((connection: MockConnection) => {
   const request = connection.request;
   expect(request.url).toBe(...)
 })
);

Это вещи, которые вы должны проверить, так как наличие неожиданного URL приведет к сбою запроса в приложении. Таким образом, вы должны проверить это. Как и заголовки, и все остальное, что имеет отношение к запросу.

Другие вопросы по тегам