Deux des moyens les plus simples possibles de le faire sont les suivantes:
1) Admettre que les contrôleurs ne peuvent pas être testé unitairement, et parce qu'ils ne peuvent pas être testé unitairement, ils seront une partie de vos tests d'intégration et parce que c'est vrai, vous allez en extraire autant de code testable que possible physiquement, et les limiter à faire un peu plus que de composer des morceaux de code qui peuvent être testés. Ce serait bien; un contrôleur Express est en quelque sorte comme une méthode main
dans votre application, à partir de la vue d'une demande individuelle, de toute façon, alors le faire mélanger les concepts durs pour décider ce qui est construit est correct, tant que le main
ne fait pas le soulever des objets lourds, mais instancier et exécuter des choses qui sont en train de soulever. 2) Composez vos fonctions de façon à ce qu'elles reçoivent tous les accessoires dont elles ont besoin, pour faire leur travail, et encore plus, elles les reçoivent presque toujours d'autres fichiers (pas le fichier dans lequel elles sont définies), à moins que l'affectation est juste une valeur par défaut. Dans le cas d'un contrôleur, si vous souhaitiez que le contrôleur soit testable à l'unité, vous le préconfigureriez pour accepter un ProductModel
à utiliser (ou une fonction à utiliser) plutôt que de supposer que vous allez tirer sur le réel. modèle.
export const CreateProduct = (ProductModel) => async (req, res, next) => {
const productData = req.body
try {
const product = await ProductModel.create(productData)
res.send(product)
} catch (err) {
next(err)
}
}
import { CreateProduct } from './create_product'
import { ConfigureProductModel } from './somewhere_else'
export const ProductRouter = express.Router()
ProductRouter.post('/', CreateProduct(ConfigureProductModel(database)))
Maintenant, pour tester, vous pouvez facilement créer un CreateProduct
où vous passez dans un ProductModel
faux. Et si vous utilisez l'exemple, il ConfigureProductModel
en tant qu'usine, vous pouvez tester en lui passant une instance db faux (si vous avez, en effet, avoir ce niveau de contrôle). Et personnellement, comme je l'ai dit, en tant que contrôleur, je veux supprimer autant de contrôle que possible, donc je supprimerais probablement la plupart du code impératif.
const CreateProduct = ProductModel => (req, res, next) =>
ProductModel.create(req.body)
.then(product => res.send(product))
.catch(next);
J'accepte votre réponse car c'est la solution la plus courte et la plus simple qui a résolu mon cas particulier. Merci tas! – borislemke