2017-02-02 69 views
5

Używam architektury testowania jako mocha i próbuję wykonać próbkę DELETE, która używa fetch do punktu końcowego, który zwraca kod stanu HTTP 204.Nock przechwytuje żądanie, ale zwraca pusty obiekt

Oto kod testu:

it('should logout user', (done) => { 
    nock(<domain>) 
    .log(console.log) 
    .delete(path) 
    .reply(204, { 
     status: 204, 
     message: 'This is a mocked response', 
    }); 

    api.logout(token) 
    .then((response) => { 
     console.log('IS DONE?--->', nock.isDone()); 
     console.log('RESPONSE--->', response); 
     done(); 
    }) 
    .catch((error) => { 
     console.log('ERROR--->', error); 
    }); 
}); 

ta zwraca następujące dane wyjściowe:

matching <domain> to DELETE <domain>/<path>: true 
(the above line being generated by the .log method in nock) 
IS DONE?---> true 
RESPONSE---> {} 

Jak widać żądanie jest właściwie przechwycone jak stwierdził metod Nock log() i isDone(), zwracany obiekt jest jednak pusty, więc nie można wysyłać twierdzeń dotyczących zwróconego kodu statusu HTTP (w tym przykładzie: 204)

Każdy pomysł, czego może mi brakować tutaj ?, dlaczego metoda reply() zwraca pusty obiekt?

UPDATE

Oto kod sposobu logout metoda remove jest owijką dla fetch zamówienie z wykorzystaniem metody DELETE HTTP.

logout(token) { 
    return remove(
    this.host, 
    END_POINTS.DELETE_TOKEN, 
    { 
     pathParams: { token }, 
    }, 
    { 
     Accept: 'application/json', 
     'Content-Type': 'application/json', 
     Authorization: `Bearer ${token}`, 
    }, 
); 
} 
+0

Jaki jest kod 'api.logout'? To nie wydaje się być czymś dostarczonym przez 'nock'. Wydaje mi się, że może tam być błąd. – Louis

+0

Reprezentuje on metodę "DELETE'HTTP dla punktu końcowego, która działa poprawnie i wydaje się być poprawnie przechwytywana, jak pokazano na wyjściu, zaktualizowałem pytanie, aby dołączyć kod, nie dodałem go wcześniej, aby uniknąć nieporozumień. – rfc1484

Odpowiedz

1

Myślę 204 nie powinien mieć odpowiedź body, więc może trzeba go zmienić na 200. Serwer oczywiście może powrócić odpowiedź, ale myślę, że nie będzie pobierać poradzić. Inny pakiet, taki jak request, będzie obsługiwał ciało o statusie 204, ale ten pakiet żądania dotyczy tylko serwera.

Również nie wiesz, co robi twój wrapper, ale myślę, że potrzebujesz uzyskać odpowiedź za pomocą obietnicy response.json(). A mocha może również obsłużyć obietnice automatycznie, możesz je tylko zwrócić. Zobacz pełną poniższy przykład:

const nock = require('nock') 
const fetch = require('isomorphic-fetch'); 
const request = require('request') 

const domain = "http://domain.com"; 
const path = '/some-path'; 
const token = 'some-token'; 

const api = { 
    logout: (token) => { 
     return fetch(domain + path, { 
      method: 'DELETE', 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     }); 
    } 
} 

describe('something',() => { 
    it('should logout user with 204 response using request package', (done) => { 
     nock(domain) 
      .log(console.log) 
      .delete(path) 
      .reply(204, { 
       status: 204, 
       message: 'This is a mocked response', 
      }); 

     request.delete(domain + path, function(err, res) { 
      console.log(res.body); 
      done(err); 
     }) 
    }); 

    it('should logout user',() => { 
     nock(domain) 
      .log(console.log) 
      .delete(path) 
      .reply(200, { 
       status: 200, 
       message: 'This is a mocked response', 
      }); 

     return api.logout(token) 
      .then((response) => { 
       console.log('IS DONE?--->', nock.isDone()); 
       return response.json(); 
      }) 
      .then(function(body) { 
       console.log('BODY', body); 
      }) 
      .catch((error) => { 
       console.log('ERROR--->', error); 
      }); 
    }); 
}); 

wyjście to:

something 
matching http://domain.com:80 to DELETE http://domain.com:80/some-path: true 
{"status":204,"message":"This is a mocked response"} 
    ✓ should logout user with 204 response 
matching http://domain.com:80 to DELETE http://domain.com:80/some-path: true 
IS DONE?---> true 
BODY { status: 200, message: 'This is a mocked response' } 
    ✓ should logout user 

Following dużą liczbą wykazywanych zależności używany:

"dependencies": { 
    "isomorphic-fetch": "^2.2.1", 
    "mocha": "^3.2.0", 
    "nock": "^9.0.6", 
    "request": "^2.79.0" 
    } 

Mam nadzieję, że to pomaga.