2017-09-10 10 views
0

postリクエストをテストして情報を取得し、mysqlデータベースに保存しようとしています。chaiとsupertestのあるノードnode jsが失敗しました

ここにルータがあります。

router.post('/dbInsert',(req,res,next)=>{ 
    user = req.body; 
    saveUser(user).then((result)=>{ 
     res.send('All info saved'); 
    }).catch((e)=>{ 
     res.send('All info not saved'); 
    }); 
}); 

ルーターはデータを投稿しようとしてから動作します。

これでテストを実行しようとすると、エラーと表示されます。ここにテストがあります。

describe('POST /dbInsert',()=>{ 
    it('should create a new user',(done)=>{ 
     var fake = { 
      Owner : "3", 
      firstname : "bla", 
      lastname : "wassup", 
      email:"[email protected]", 
      password : "akhjashjkdadh", 
      token : "121212121" 
     } 
     request(app) 
      .post('/dbInsert') 
      .send(fake) 
      .expect(200) 
      .expect((res)=>{ 
       expect(res.body).to.include(fake); 
      }) 

      .end((err,res)=>{ 
       if(err) 
        return done(err); 
      }); 
    }); 
}); 

ここはエラーです。

1 failing 

    1) POST /dbInsert should create a new user: 
    AssertionError: expected {} to have property 'Owner' 

/* Not related to the above question but just curious */

私はこれに新しいですし、またお聞きしたかったのですが、どのようにデータベースが独自データベース上でテストするが、これをテストし、偽のデータベースを持っていないのように、クローン化され、その後、自分自身を取得することができます削除されました。私はスパイを見ましたが、それを行う方法があれば分かりません。

+0

「上記に関係していない」という質問については、[テストフィクスチャ](https://en.wikipedia.org/wiki/Test_fixture#Software)を参照していると思います。テストデータベースのフィクスチャをセットアップするには、[node-sql-fixtures](https://github.com/city41/node-sql-fixtures)のようなものを検討するか、前/後のフックでテストデータベースをセットアップするために自分で何かを書く。 – tavnab

答えて

1

あなたが思うように、Supertestテストは動作しません。これはあなたがあなたのサーバーに送信したものを単体テストしません。これはサーバーからの応答をテストするので、送信したオブジェクトではありません。

.expect((res)=>{ 
    expect(res.body).to.include(fake); 
}) 

あなたのルートでres.send(body)を呼び出す場合、あなたはこのようにそれを検証することができるはずです:私は見

.end((err, res) => { 
    if (err) return done(err); 
    expect(res.body).to.have.property("Owner").that.equal("3"); 
    return done(); 
}) 

もう一つの問題は、あなたがエラーを適切に処理していないということです。あなたのケースでは、エラーが発生したときに200を送信します。つまり、失敗したタイミングを知らず、更新された検証が正しく機能していないようです。

.catch((E)=> {。 //唯一の違いは、メッセージ res.sendは( 'すべての情報が保存されていない')である。 })。

これを試してみてください:

.catch((E)=> { は//今、それは失敗 res.status(500).send(e.message)を注意するために500になります。 });

これはエラーが発生したときにdoneに電話することになるため、これが成功するとタイムアウトになります。 ifステートメントを削除するだけです。

.end((err,res)=>{ 
    if(err) 
     return done(err); 
}); 

これは動作するはずです:

.end(done); 

全体shibang:

router.post('/dbInsert',(req,res,next)=>{ 
    user = req.body; 
    saveUser(user).then((result)=>{ 
     res.send(user); 
     next(); 
    }).catch((e)=>{ 
     res.status(500).send(e.message); 
     next(); 
    }); 
}); 

describe('POST /dbInsert',()=>{ 
    it('should create a new user',(done)=>{ 
     var fake = { 
      Owner : "3", 
      firstname : "bla", 
      lastname : "wassup", 
      email:"[email protected]", 
      password : "akhjashjkdadh", 
      token : "121212121" 
     } 
     request(app) 
      .post('/dbInsert') 
      .send(fake) 
      .expect(200) 
      .end((err, res) => { 
       if (err) return done(err); 
       expect(res.body).to.have.property('Owner').that.equal(fake.Owner); 
       done(); 
      }); 
    }); 
}); 

をテストするために、私はこれが動作することを検証:

const request = require('supertest'); 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const expect = require('chai').expect; 
const app = express(); 

app.use(bodyParser.json()); 

app.post('/user', function(req, res) { 
    return res.send(req.body); 
}); 

request(app) 
    .post('/user') 
    .send({ 
     foo: "bar" 
    }) 
    .expect(200) 
    .end(function(err, res) { 
    if (err) throw err; 
    expect(res.body.foo).to.equal("bar"); 
    }); 

まだ動作していない場合は、見えない何かが続かなければなりません。出力を確認できない場合はconsole.dir(res.body)を試してください。

+0

あなたが言ったとおりにしましたが、それでも同じエラーが発生しています。 AssertionError:プロパティ{所有者}を持つことが期待されています –

+0

ルータからの応答をこのように返しました。 res.send(req.body); –

+0

更新されたレスポンスを参照してください。 – EmptyArsenal

関連する問題