2015-01-20 9 views
5

otrzymuję następujący błąd podczas próby przetestować metodę:Węzeł ekspresowe testowania mock res.status (status) .json (obj)

TypeError: Cannot call method 'json' of undefined

poniżej jest mój kod, to bym się na ten sam błąd "status", jeśli usunę res.status z metody testowej.

Jak mogę zdefiniować „json” tak ja nie otrzymuję wyjątek rzucony na:

res.status(404).json(error);

podczas testowania tej funkcji.

stores.js

{ //the get function declared above (removed to ease of reading) 
     // using a queryBuilder 
     var query = Stores.find(); 
     query.sort('storeName'); 
     query.exec(function (err, results) { 
      if (err) 
       res.send(err); 
      if (_.isEmpty(results)) { 
       var error = { 
        message: "No Results", 
        errorKey: "XXX" 
       } 
       res.status(404).json(error); 
       return; 
      } 
      return res.json(results); 
     }); 
    } 

storesTest.js

it('should on get call of stores, return a error', function() { 

    var mockFind = { 
     sort: function(sortOrder) { 
      return this; 
     }, 
     exec: function (callback) { 
      callback('Error'); 
     } 
    }; 

    Stores.get.should.be.a["function"]; 

    // Set up variables 
    var req,res; 
    req = {query: function(){}}; 
    res = { 
     send: function(){}, 
     json: function(err){ 
      console.log("\n : " + err); 
     }, 
     status: function(responseStatus) { 
      assert.equal(responseStatus, 404); 
     } 
    }; 

    StoresModel.find = sinon.stub().returns(mockFind); 

    Stores.get(req,res); 

Odpowiedz

10

Konwencja metod chainable jest zwracanie this na końcu. Podczas testów wyodrębniasz obiekt res. Każda metoda na tym obiekcie powinna kończyć się na return this;.

res = { 
    send: function(){ }, 
    json: function(err){ 
     console.log("\n : " + err); 
    }, 
    status: function(responseStatus) { 
     assert.equal(responseStatus, 404); 
     // This next line makes it chainable 
     return this; 
    } 
} 
+1

'send' i' json' nie są przenośne, więc może to prowadzić do fałszywych pozytywnych testów, jeśli je zdefiniujesz. https://github.com/strongloop/express/blob/master/lib/response.js#L222 – Chris

+0

Zgaduję, że masz rację - metoda "status" to jedyna rzecz, która naprawdę musi być przenośna. Zaktualizowałem swoją odpowiedź. –

+0

Zauważyłem, że dokumentacja sinonowa wspomina o tym, że to powróciło. Powinniśmy być w stanie zrobić coś w rodzaju: status: sinon.stub(). ReturnThis() –