2017-12-18 11 views
0

javascript、node、mongoDB、mongooseを使用する小さなアプリケーションを作成しています。私は2つのコレクションを持っています。 {_ ID:{タイプ:文字列、必須:真}姓:{タイプ:文字列、必須:真}、..}ネストしたオブジェクトを使ってテストを書くときのMogoose検証エラー

グループ{すべてのグループがユーザ

ユーザーの配列が含まれ、ユーザーおよびグループ_id:{type:String、required:true}、ユーザー:[{user:userSchema}]

私はMochaとSuperagentを使用してAPI単位テストを作成しています。ユーザーのネストされたオブジェクトを含むグループのサンプルドキュメントを挿入すると、検証エラーが発生しましたか?

この例で何が問題になっているのか教えてください。

var userSchema = 
{ 
    _id: { 
     type: String, 
     required: true, 
    }, 
    profile: { 
     firstName: { 
      type: String, 
      required: true 
     }, 
     lastName: { 
      type: String, 
      required: true 
     } 
}; 

var GroupSchema = 
{ 
    _id: { 
     type: String, 
     required: true 
    }, 
    users:[{ 
     user: User.userSchema 
    }] 
}; 
it('can query group by id', function(done) { 
    var users = [ 
    { _id: 'az', profile: {firstName: 'a', lastName: 'z'}}, 
    { _id: 'bz', profile: {firstName: 'b', lastName: 'z'}}, 
    ]; 

    User.create(users, function(error, users) { 
    assert.ifError(error); 
    Group.create({ _id: 'ab', users: [{ _id: 'az', profile: {firstName: 'a', lastName: 'z'}}, { _id: 'bz', profile: {firstName: 'b', lastName: 'z'}}] }, function(error, doc) { 
    assert.ifError(error); 
    var url = URL_ROOT + '/api/groups/id/ab'; 

    superagent.get(url, function(error, res) { 
     assert.ifError(error); 
     var result; 
     assert.doesNotThrow(function() { 
     result = JSON.parse(res.text); 
     }); 
     assert.ok(result.group); 
     assert.equal(result.group._id, 'ab'); 
     done(); 
    }); 
    }); 
    }); 
}); 

エラーメッセージ:

Uncaught ValidationError: ChatGroup validation failed: users.1._id: Cast to ObjectID failed for value "bz" at path "_id", users.0._id: Cast to ObjectID failed for value "az" at path "_id", users.0.user.profile.lastName: Path `user.profile.lastName` is required., users.0.user.profile.firstName: Path `user.profile.firstName` is required., users.0.user._id: Path `user._id` is required., users.1.user.profile.lastName: Path `user.profile.lastName` is required., users.1.user.profile.firstName: Path `user.profile.firstName` is 

答えて

0

私はあなたのGroupSchema定義が間違っていると思う:

var GroupSchema = 
{ 
    _id: { 
     type: String, 
     required: true 
    }, 
    users:[{ 
     user: User.userSchema 
    }] 
}; 

あなたがテストusers配列にそれを使用している方法はUser.userSchema配列の型を持っている必要があります:

var GroupSchema = 
{ 
    _id: { 
     type: String, 
     required: true 
    }, 
    users:[{ 
     type: User.userSchema // type, not 'user' 
    }] 
    // OR just: users: [User.userSchema] 
}; 

そうでない場合、あなたはまだ、あなたのテストでは、あなたがこのようにそれを使用する必要があり、あなたの元のスキーマを使用する必要がある場合:

var users = [ 
    { user: { _id: 'az', profile: {firstName: 'a', lastName: 'z'}} }, 
    { user: { _id: 'bz', profile: {firstName: 'b', lastName: 'z'}} }, 
    ]; 
+0

どうもありがとう、この変更はうまくいきました。 "OR OR:ユーザー:[User.userSchema]" – Student

関連する問題