Тестирование nodejs (express) приложения

Khotey Vitaliy

Хочу спросить ваше мнение, у меня есть 2 сущности: Роуты

import express from 'express';
import * as ProductController from '../controllers/product';
import checkToken from '../middlewares/checkToken';
import getUser from '../middlewares/getUser';
const router = express.Router();
router.post('/products', checkToken, getUser, ProductController.create);
router.put('/products', checkToken, getUser, ProductController.update);
router.get('/products/:categoryUrl', ProductController.getProductsByCategoryUrl);
router.get('/products/:categoryUrl/:productUrl', checkToken, getUser, ProductController.getProductByUrl);
router.get('/products', ProductController.getAll);
export default router;

И соответсвующие им контроллеры:

import Product from '../models/product';
import Category from '../models/category';
import * as PageStatusService from '../services/pageStatusService';
import * as CategoryService from '../services/categoryService';
import urlCheck from '../helpres/check-is-valid-url';
export async function create(req, res, next) { const productData = req.body; const userId = req.user._id; let product; let isStatusExist; let isCategoryExist; productData.user = userId; if (!urlCheck(productData.url)) { return next({ status: 400, message: 'Invalid url value' }); } try { isStatusExist = await PageStatusService.isExistStatus(productData.status); } catch ({ message }) { return next({ status: 400, message }); } if (!isStatusExist) { return next({ status: 400, message: 'Invalid status value' }); } // TODO: add check for category, product belong to last level category // if categories with parent category productData.category is empty try { isCategoryExist = await CategoryService.isExistCategoryById(productData.category); } catch ({ message }) { return next({ status: 400, message }); } if (!isCategoryExist) { return next({ status: 400, message: 'Invalid category value' }); } try { product = await Product.create(productData); } catch ({ message }) { return next({ status: 400, message }); } res.json(product);
}
...

Так вот, стоит ли отдельно тетсировать контроллер, или тестировать только роуты, кт по сути тестирую роут мы сразу тестируем и контроллер, что то типо:

var should = require('should');
var assert = require('assert');
var request = require('supertest');
var mongoose = require('mongoose');
var winston = require('winston');
var config = require('./config-debug'); describe('Account', function() { it('should return error trying to save duplicate username', function(done) { var profile = { username: 'vgheri', password: 'test', firstName: 'Valerio', lastName: 'Gheri' }; // once we have specified the info we want to send to the server via POST verb, // we need to actually perform the action on the resource, in this case we want to // POST on /api/profiles and we want to send some info // We do this using the request object, requiring supertest! request(url) .post('/api/profiles') .send(profile) // end handles the response .end(function(err, res) { if (err) { throw err; } // this is should.js syntax, very clear res.should.have.status(400); done(); }); });
1 ответ

Khotey Vitaliy

Нужно понимать что существует множество видов тестирования, самые актуальные из которых -

  • юнит-тестировани - в ходе теста проверяются имплементация интерфейсов. Другими словами, проверки подвергаются все публичные методы объекта, модуля, комопнента.
  • интеграционное тестирование - в ходе тестирования проверяется работа совокупности отдельных частей программы.
  • системное тестирование - в ходе теста проверяется выполнение работы самой программы.

Все виды тестирования являются разными слоями абстракции и применяются на разных временных этапах создания программы.

Поэтому, как Вы сами могли уже заметить, Ваш вопрос заключается в том, можно ли пропустить этап юнит-тестирования и сразу писать интеграционные.

Я бы не советовал, но дело все равно за Вами.

licensed under cc by-sa 3.0 with attribution.