Unit Test 사용시 Tips
trx.table('...')
을 사용하자.
trait('DatabaseTransactions');
을 사용할 때는 Lucid 를 사용하지 말자. 이유는 분석을 하지 않아서 잘 모르겠지만, Lucid ORM 을 사용하면, transaction 으로 insert 한 record 를 확인할 수 없었다.const { test, trait, before, after } = use('Test/Suite')('Solicitor'); const sinon = require('sinon'); const Product = use('App/Models/Product/Product'); const Database = use('Database'); trait('DatabaseTransactions'); test('test-db-insert', async ({ assert }) => { const trx = await Database.beginTransaction(); const productId = 130; // canceled // const productId = 302; // not active yet const product = await Product.find(productId, trx); const mclass = new MyClass(prodcutId); await mclass.run(); // await Product.find(productId, trx) --> 제대로 동작하지 않는다. const product2 = await trx.table('product').where('id', productId).first(); assert.equal(product.name, product2.name); trx.rollback(); });
node test_ace.js test -f myclass.spec.js
timeout(0)
아래 처럼 때론 timeout 이 돼서 unittest 가 끝나는 경우가 있다. Error: Test timeout, ensure "done()" is called; ...
test('test-db-insert', async ({ assert }) => { const trx = await Database.beginTransaction(); ... assert.equal(product.name, product2.name); trx.rollback(); }).timeout(0);
trx.rollback()
기본적으로 Database.beginTransaction();
을 사용하면, 자동으로 trx.rollback()
을 해주기는 하지만, 만약 여러 test 내에서 각각 trx 를 호출하는 경우라면, 각 test 마다 trx.rollback()
을 해줘야 한다. 그렇지 않으면 종종 timeout 이 발생한다.
Error: Test timeout, ensure "done()" is called; ...
댓글 없음:
댓글 쓰기