2017-04-01 5 views
0

Ich führe Unit Tests mit Karma-Jasmin, Webpact. Ich habe versucht, einen Datensatz in einer MySQL-Datenbank mit Bücherregal einzufügen. I erhielt die folgende Fehlermeldung:ReferenceError: Bücherregal ist nicht definiert

Reference: Bücherregal nicht bei module.exports.addCategoryWithProducts definiert (app_serv/order/test/order.util.spec.js: 94215: 2) am Gegenstand. (app_serv/order/test/order.util.spec.js: 94059: 3) bei ContextKarma.loaded (http://localhost:9876/context.js:151:12) TypeError: Kann die Eigenschaft 'then' von undefined bei Object nicht lesen. (App_serv/order/test/order.util.spec.js: 94074: 4)

Typeerror: _this.driver.createConnection ist keine Funktion

Mein Code:

var knex = require('knex')({ 
    client: 'mysql', 
    connection: { 
    host  : 'localhost', 
    user  : 'user1', 
    password : 'toto', 
    database : 'totoDb', 
    charset : 'utf8' 
    } 
}); 

module.exports = require('bookshelf')(knex); 

module.exports.addCategoryWithProducts = function(categoryToAdd) { 

    bookshelf.transaction(function(t) { 
    var products = categoryToAdd.products; 
    var tableProd = []; 

    //if (!req.params.idCategory || req.params.idCategory ==0) { 
    Category.forge({ 
     name: categoryToAdd.name, 
     code: categoryToAdd.code, 
     tax_percentage: categoryToAdd.tax_percentage, 
     description: categoryToAdd.description 
    }) 
     .save(null, { transacting: t }) 
     .then(function(category) { 
     for (var i = 0; i < products.length; i++) { 
      tableProd.push({ 
      barcode: products[ i ].barcode, 
      cip_13: products[ i ].cip_13, 
      category_id: category.id, 
      quantity: products[ i ].quantity, 
      retail_price: products[ i ].retail_price, 
      description: products[ i ].description, 
      name: products[ i ].name, 
      inn: products[ i ].inn, 
      kind: products[ i ].kind, 
      comment: products[ i ].comment, 
      status: products[ i ].status, 
      critical_threshold: products[ i ].critical_threshold, 
      max_threshold: products[ i ].max_threshold, 
      date_end: products[ i ].date_end 
      }); 
     } 

     Products.forge(tableProd) 
      .invokeThen('save', null, { transacting: t }) 
      .then(function(products) { 


      //console.log('inside insert of collection '+ JSON.stringify({category : category.toJSON(), produits: products})) 
      //res.json({error : false, data: {category : category.toJSON(), products: products}}); 

      t.commit(); 

      return Promise.resolve(category.related('products')); 
      }) 
      .catch(function(err) { 
      return Promise.reject(err.message); 
      //console.log('Erreur dans Products.forge: ' + err.message); 
      res.status(500) 
       .json({ error: true, code: err.code, message: err.message }); 
      }) 

     }) 
     .catch(function(err) { 
     return Promise.reject(err.message) 
     //console.log('Erreur dans Products.forge: ' + err.message); 
     //res.status(500).json({error: true, code : err.code, message: err.message}); 
     }) 
    }); 
} 

UNIT Testcode:

it("addCategoryWithProducts", function(done){ 
    addCategoryWithProducts(categoryMock) 
     .then(function(catWithPrds){ 
      expect(catWithPrds).toBeDefined(); 
      expect(catWithPrds.products).toBeDefined(); 
      expect(catWithPrds.products.length).toBe(3); 
     }) 

); 

nach dem vergeblichen viele Lösungen versucht, entschied ich mich für Ihre Hilfe zu bitten .

+0

Ihr Code unvollständig aussieht. Wo und wie ist 'Bücherregal' definiert? Und es sieht so aus, als würde der Code bis 'require ('bookshelf') (knex);' zu einer anderen Quelldatei gehören. – flaviodesousa

+0

Ja, es ist in einer anderen Datei. Ich glaube nicht, dass das Problem da ist. – Evabila

+0

Vielleicht nicht, aber Ihr Fehler erwähnt ausdrücklich, dass "Bücherregal" nicht definiert ist. Der erste Gedanke, den jemand sehen würde, ist wo und wie er definiert ist. Es könnte helfen, wenn Sie die Codesegmente korrekt teilen. – flaviodesousa

Antwort

0

Es ist nicht ganz klar, wie Ihre Code-Basis funktioniert, aber von TypeError: Cannot read property 'then' of undefined scheint es, dass Sie nicht ordnungsgemäß ein Versprechen zum Komponententest zurückgeben.

try Wechsel

Products.forge(tableProd) 
    .invokeThen('save', null, { transacting: t }) 
    .then(function(products) { 

zu

return Products.forge(tableProd) 
    .invokeThen('save', null, { transacting: t }) 
    .then(function(products) { 

Auch können Sie Ihre Versprechen und Transaktionsabwicklung vereinfachen:

  • Sie brauchen nicht t.commit() explizit zu nennen, da sie automatisch ist Wird von Bookshelf aufgerufen, wenn das Versprechen
  • aufgelöst wird
  • Normalerweise brauchen Sie kein Promise in einem anderen Promise. Anstatt also return Promise.resolve(category.related('products')) Sie konnte nur return category.related('products') und statt return Promise.reject(err.message) nur return err.message (aber es wäre wahrscheinlich besser, wieder Wurf)
+0

Ich habe versucht, meinen Code zu ändern, aber ich habe immer noch die gleiche Fehlermeldung. Ich vereinfache auch meinen Code nach Ihren Vorschlägen und ich möchte Ihnen dafür danken – Evabila

+0

Sie meinen, Sie bekommen immer noch die 'TypeError: Kann nicht lesen Eigenschaft 'dann' von undefined' Fehler? Weil es der einzige war, von dem ich dachte, ich hätte genug Daten darüber. Das 'ReferenceError: bookshelf is not defined' und' TypeError: _this.driver.createConnection' Fehler scheinen verwandt zu sein, wie Sie die 'Bookshelf'-Referenz definieren. – flaviodesousa

Verwandte Themen