wake-up-neo.com

Angular 4 Unit-Tests mit Jasmin/Karma mit http-Nachahmung - wie zu beheben

Ich habe einen Dienst, den ich in Winkeltyp 4-TypeScript-Jasmin testen möchte.

Die Variable http führt nun eine post aus und gibt eine Identität zurück. Sie sendet jedoch nichts. 

Ich möchte nur eine gute Codeabdeckung haben, aber ich verstehe nicht, wie ich diese spöttische Aussage vervollständigen kann.

hier ist die Methode für http post in meiner Servicedatei

addSession() {
        let headers = new Headers({ 'Content-Type': 'application/json' });
        let options = new RequestOptions({ headers: headers });

        return this.http.post(this.url, JSON.stringify({}), options)
            .map((response: Response) => response.json());

}

Dann die SPEC FILE , die ich nicht bekomme, um wirklich zu testen, ich vermute, dass ich eine Nummer vom Dienst http post erhalten habe, die Antwort sollte so aussehen wie 000000014 

Spec

import { TrackerFormService } from './tracker-form.service'
import { Observable } from 'rxjs/Observable'

describe('TrackerFormService', () => {

    let trackerFormService: TrackerFormService,
        mockHttp;

    beforeEach(() => {
        mockHttp = jasmine.createSpyObj('mockHttp', ['get', 'post', 'put']
        )
        trackerFormService = new TrackerFormService(mockHttp);
    });

    describe('addSession', () => {

        it('add session ', () => {
              // how to test,  what to test?    
              // response , is a number?  how to mock/fake this?

        })

    })

})
7
user6321478

Um das zu erreichen, was Sie möchten, ist der Mock, den Sie benötigen, eine einfache Funktion, die das gleiche zurückgibt, wie es normalerweise bei POST der Fall ist. Eine andere Sache ist, dass Ihr Test den Server nicht für real treffen sollte, also würden Sie so etwas benötigen (möglicherweise müssen Sie andere Abhängigkeiten hinzufügen):

import { HttpModule } from '@angular/http';
import { TrackerFormService } from './tracker-form.service'
import { Observable } from 'rxjs/Observable'

describe('TrackerFormService', () => {
// Mock the service like this and add all the functions you have in this fashion
let trackerFormService: TrackerFormService,
  mockService = {
    addSession: jasmine.createSpy('addSession').and.returnValue(Observable.of('your session object mock goes here'))
  };

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpModule],
      providers: [{
        provide: TrackerFormService,
        useValue: mockService
      }]
    });
  });

  // Do this trick to inject the service every time, and just use `service` in your tests
  beforeEach(inject([TrackerFormService], (trackerFormService) => {
    service = trackerFormService;
  }));

  describe('addSession', () => {
    it('add session ', () => {
      let fakeResponse = null;

      // Call the service function and subscribe to it to catch the fake response coming from the mock.
      service.addSession().subscribe((value) => {
        // in here value will be whatever you put as returnValue (remember to keep the observable.of())
        fakeResponse = value;
      });

      // expects as in any test.
      expect(fakeResponse).toBeDefined();
      expect(fakeResponse).toBe('your session object mock goes here');
    });
  });
});
6
Sonicd300

Mit Angular 4.3 kam der HttpClient-Dienst, der Http ersetzt und eine einfachere Möglichkeit bietet, HTTP-Anforderungen zu simulieren. Es ist auf der offiziellen Seite gut dokumentiert: https://angular.io/guide/http

0
TekTimmy

Auf die Art und Weise, wie Sie den Test/Mock eingerichtet haben, können Sie die Rückgabe des Anrufs nachstellen und prüfen, ob Sie das erwartete Ergebnis erzielt haben. Auf diese Weise testen Sie, ob die gespielte Antwort von Ihrer Kartenanweisung ordnungsgemäß konvertiert wird. Mit Ihrem Spion können Sie auch überprüfen, wie die Post-Methode aufgerufen wurde. Dadurch wird geprüft, ob die Optionen Ihren Erwartungen entsprechen.

Aber meiner Meinung nach ist das eine ziemlich komplizierte Lösung. Ich würde es vorziehen, Spöttereien und Spione zu vermeiden, indem ich die Methode aufspalte, sodass jede Methode nur eine Sache tut. Weil Ihre addSession-Methode derzeit drei verschiedene (noch logisch abhängige) Dinge ausführt:

  1. optionen für einen Aufruf von addSession xhr erstellen
  2. führt den Anruf aus
  3. antwort umwandeln

Wenn Sie die Methode in drei Teile aufteilen, können Sie die Methoden 1 und 3 in separaten Tests testen, und Methode 2 würde nur den Aufruf der http-Bibliothek enthalten. Auf diese Weise können Sie denselben Testwert wie oben erzielen, ohne die http-Bibliothek aufzurufen.

Was ist nun mit Methode # 2? Es ist noch nicht getestet und meiner Meinung nach gibt es keinen Grund, es überhaupt zu testen. Weil Sie diesen Code nicht geschrieben haben. Auch wenn Sie Winkelmodule verwenden, sind sie sicher, dass sie solide Unit-Tests haben.

Die Antwort Ihres Dienstes sollte bereits durch einen zusätzlichen Integrationstest abgedeckt sein. Führen Sie den Test weniger häufig aus, um zu überprüfen, ob der Dienst api weiterhin das liefert, was Sie erwarten.

Wenn Sie wirklich möchten, dass diese eine Zeile grün in Ihrer Code-Abdeckung ist, können Sie optional eine Bibliothek namens Nock verwenden. Nock fängt den gesamten Xhr-Verkehr ab, den Ihre App verursacht. In Ihrer Testdatei können Sie Xhr-Anforderungen mit dem Nock-Objekt auf gemusterte Antworten zuordnen.

var scope = nock('http://myapp.iriscouch.com')
                .post('/users', {
                  username: 'pgte',
                  email: '[email protected]'
                })
                .reply(201, {
                  ok: true,
                  id: '123ABC',
                  rev: '946B7D1C'
                });

kopiert von: https://www.npmjs.com/package/nock

Als Referenz und zusätzliche Informationen zum Testen im Allgemeinen und wie viel getestet werden sollte, empfehle ich das Ansehen von "Budgeting Reality" von Justin Searls

0
Tabueeee