0.0.2 • Published 1 year ago
@adaptably/provide v0.0.2
@adaptably/provide
Simple dependency injection and replacement for Node.js applications.
Motivation
This package encourages an architectural pattern of keeping functions that do stuff (setup functions) separate from functions that put stuff together (provider functions).
The result is modular application code that is easy to test without complex dependency mocking.
Installation
npm install @adaptably/provide
Basic Usage
adopt.setup.js
Setup functions expect dependencies to be provided to them.
export default ({ getAvailableBreed }) => {
return async (numberToAdopt) => {
const adoptedBreed = await getAvailableBreed()
return `Adopted ${ numberToAdopt } ${ adoptedBreed }(s)!`
}
}
Providers provide a default set of dependencies to setup functions.
adopt.provide.js
import provide from '@adaptably/provide'
import getAvailableBreed from './getAvailableBreed.js' // Calls an API and returns a dog breed.
import setupAdoptDog from './adopt.setup.js'
export default provide(setupAdoptDog).with({ getAvailableBreed })
adopt.test.js
Testing becomes simple without complex mocking.
import provideAdopt from './adopt.provide.js'
test('adopts whatever dog breed is available', async () => {
const adoptTerrier = await provideAdopt.withReplaced({ getAvailableBreed: () => 'Terrier' })
expect(adoptTerrier(2)).toEqual('Adopted 2 Terrier(s)!')
const adoptLabrador = await provideAdopt.withReplaced({ getAvailableBreed: () => 'Labrador' })
expect(adoptLabrador(2)).toEqual('Adopted 2 Labrador(s)!')
const adoptRandom = await provideAdopt()
expect(adoptRandom(2)).toEqual('Adopted 2 [whatever breed the API really returns](s)!')
})