[컴][웹] Adonisjs Unittest 사용시 Tips

TDD / 아도니스 / 유닛  테스트 / 팁스 /에러 해결 / how to recognize after insert / insert 후에 인식 / insert 한 내용 확인하는 방법


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();
});
아래처럼 unittest 를 실행할 수 있다.
node test_ace.js test -f myclass.spec.js

timeout(0)

아래 처럼 때론 timeout 이 돼서 unittest 가 끝나는 경우가 있다.
Error: Test timeout, ensure "done()" is called; ...
이때는 timeout(0) 을 사용하면 된다.
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; ...





댓글 없음:

댓글 쓰기