2017-04-01 4 views
0

このコードの初めにデータベースからユーザーを見つける方法を理解しようとしていますが、ユーザーはコードの後半に作成されます。後で作成されている間にMongoDbから最初にユーザーを見つけるモチーフ

モカドキュメントは

テストの後、前に表示される、またはあなたのフックに散在することができます。と言いますフックは、必要に応じて定義された順序で実行されます。すべてのbefore()フックが実行され、次にbeforeEach()フック、テスト、afterEach()フック、およびafter()フック(一度)が含まれます。ユーザーが後で来るbeforeEach機能で作成されている間、ユーザーのvkarpov15 'は、ここで見つけることができますどのように

var assert = require('assert'); 
var express = require('express'); 
var status = require('http-status'); 
var superagent = require('superagent'); 
var wagner = require('wagner-core'); 

var URL_ROOT = 'http://localhost:3000'; 
var PRODUCT_ID = '000000000000000000000001'; 

describe('User API', function() { 
    var server; 
    var Category; 
    var Product; 
    var User; 

    before(function() { 
    var app = express(); 

    models = require('./models')(wagner); 

    Category = models.Category; 
    Product = models.Product; 
    User = models.User; 

    app.use(function(req, res, next) { 
     User.findOne({}, function(error, user) { 
     assert.ifError(error); 

     req.user = user; 
     console.log(user); 
     next(); 
     }); 
    }); 

    app.use(require('./api')(wagner)); 

    server = app.listen(3000); 
    }); 

    after(function() { 
    server.close; 
    }); 

    beforeEach(function(done) { 
    Category.remove({}, function(error) { 
     assert.ifError(error); 
     Product.remove({}, function(error) { 
     assert.ifError(error); 
     User.remove({}, function(error) { 
      assert.ifError(error); 
      done(); 
     }); 
     }); 
    }); 
    }); 

    beforeEach(function(done) { 
    var categories = [ 
     { _id: 'Electronics' }, 
     { _id: 'Phones', parent: 'Electronics' }, 
     { _id: 'Laptops', parent: 'Electronics' }, 
     { _id: 'Bacon' } 
    ]; 

    var products = [ 
     { 
     name: 'LG G4', 
     category: { _id: 'Phones', ancestors: ['Electronics', 'Phones'] }, 
     price: { 
      amount: 300, 
      currency: 'USD' 
     } 
     }, 
     { 
     _id: PRODUCT_ID, 
     name: 'Asus Zenbook Prime', 
     category: { _id: 'Laptops', ancestors: ['Electronics', 'Laptops'] }, 
     price: { 
      amount: 2000, 
      currency: 'USD' 
     } 
     }, 
     { 
     name: 'Flying Pigs Farm Pasture Raised Pork Bacon', 
     category: { _id: 'Bacon', ancestors: ['Bacon'] }, 
     price: { 
      amount: 20, 
      currency: 'USD' 
     } 
     } 
    ]; 

    var users = [{ 
     profile: { 
     username: 'vkarpov15', 
     picture: 'http://pbs.twimg.com/profile_images/550304223036854272/Wwmwuh2t.png' 
     }, 
     data: { 
     oauth: 'invalid', 
     cart: [] 
     } 
    }]; 
    Category.create(categories, function(error) { 
     assert.ifError(error); 
     Product.create(products, function(error) { 
     assert.ifError(error); 
     User.create(users, function(error) { 
      assert.ifError(error); 
      done(); 
     }); 
     }); 
    }); 
    }); 

    it('can save users cart', function(done) { 
    var url = URL_ROOT + '/me/cart'; 

    superagent. 
     put(url). 
     send({ 
     data: { 
      cart: [{ product: PRODUCT_ID, quantity: 1 }] 
     } 
     }). 
     end(function(error,res) { 

     assert.ifError(error); 
     assert.equal(res.status, status.OK); 
     User.findOne({}, function(error, user) { 

      assert.ifError(error); 
      assert.equal(user.data.cart.length, 1); 
      assert.equal(user.data.cart[0].product, PRODUCT_ID); 
      assert.equal(user.data.cart[0].quantity, 1); 
      done(); 
     }); 
     }); 
    }); 

}) 

app.use(function(req, res, next) { 
     User.findOne({}, function(error, user) { 
     assert.ifError(error); 

     req.user = user; 
     console.log(user); 
     next(); 
     }); 
    }); 

それが後のコードでは、ここで作成されます。

Category.create(categories, function(error) { 
     assert.ifError(error); 
     Product.create(products, function(error) { 
     assert.ifError(error); 
     User.create(users, function(error) { 
      assert.ifError(error); 
      done(); 
     }); 
     }); 
    }); 

答えて

1

ユーザーがそこに照会されていない、そのコードは、単にサーバーに各要求する前にユーザーを照会します急行ミドルウェアを登録します。ご覧のとおり、リクエストはitテストケースで発行されますが、テストケースごとにユーザーが作成されます(beforeEachブロックを参照)。

ps:afterブロックにserver.close()の後にかっこがありません。

+0

私は、beforeEachブロックでユーザーが作成されていることを理解しています。しかし、文書では、beforeブロックがbeforeブロックの前に来ると言います。それで、beforeブロックはbeforeEachブロックで作成されたユーザーにどのようにアクセスできますか? – DowinskiField

+0

私が言ったように、beforeブロックはユーザーにアクセスしません。ユーザーを取得する高速ミドルウェア(app.use)のみを登録しますが、そこでは呼び出されません。 –

+0

私は参照してください。だから、ブロックの機能は何ですか?ブロックはどこに呼び出されますか? – DowinskiField

関連する問題