factory-castrado
Factory Castrado is a library for Node.js which provides factories for objects creation. It is designed for use with Backbone-style models which use new Model(attributes)
for initialization and model.create(function(err, model){...})
for saving.
It is highly inspired by:
- factory_girl - ruby
- factory-lady - node.js
- factory-boy - node.js
Installation
Node.js:
npm install factory-castrado
Usage
Model requirements
Coffeescript:
# factory-castrado puts only one requirement on models: # they *must be constructor functions* that accept an attributes object. # Your model must be comply with: model = attributes # In order to save to model to a database during Factory.create, # factory-castrado uses "model.create (err, model) ->" = # ...Insert into db... doneerrorthis # If no create method is found, the model is passed back without saving. # If a non-backbone object is given for a factory's models, # the model.get() and model.set() methods are shimmed.
Defining factories
Coffeescript:
Factory = require 'factory-castrado'Model = require'backbone'ModelPlainModel = # Bare object counter = 1 # Define with (name, model, attributes) Factorydefine 'user'Model : cb"user@test.com" name: "Test name" password: 'abc123' # With associations, using (name, options): Factorydefine 'post' model: Model attributes: title: "Test title" content: "Test content" associations: user: # This creates an embedded post.user object, and a user_id attribute factory: 'user' # Defaults to association name (user here) key: 'user_id' # Defaults to name + _id # Non-Backbone objects work the same: # NOTE: factory-castrado shims model.get() and model.set() methods Factorydefine 'session'PlainModel : cbMathrandom : cb require 'moment'add'days'7toDate Factorydefine 'plainUser' model: PlainModel attributes: name: "Test" associations: session: factory: 'session' # Attaches embedded user.session key: 'session_id' # Attaches user.session_id foreign key # On a backbone-style model, the foreign key would be in # the model's attributes hash, accessed using user.get('session_id')
Using factories
Coffeescript:
Factorybuild 'user' # (err, user) -> Also supported # user is an unsaved user model Factorybuild 'user'name:"New" # user is an unsaved user model with name "New" Factorybuild 'post' # post is an unsaved post model # post.user is a saved associated user model # post has new attribute 'user_id' with the user's id Factorycreate 'user' # (err, user) -> Also supported # User is SAVED model # A note about Error-first callbacks: # factory-castrado checks the callback's arity to determine # if it is an error-first callback. These are both supported: Factorycreate 'user'Factorycreate 'user' # Don't care about the error # However, this will NOT work: Factorycreate 'user' # DOES NOT WORK - argument will be user, not err.
Associations
Coffeescript:
Factorydefine 'post' model: Model associations: user: # Defaults to association name (user here) factory: 'user' # Defaults to name + _id key: 'user_id' # Gets foreign key from associated model # Default getter, just grabs id : return assocObjid # Sets foreign key on factory's built model # Default setter (pseudocode - uses 'key' from above if setter not overridden) : objset keyval # Conveniently provides default setters/getters type: 'id' # Currently supported: "id", "ids[]" # Using type: "ids[]" provides a default setter than inserts id into object's array of ids # Id-array associations # This will generate a message model with: # user_ids: [id1, id2] # as well as user models attached directly at msg.to , msg.from Factorydefine 'message' model: MessageModel attributes: title: "Hello World" associations: from: factory: 'user' key: 'user_ids' type: 'ids[]' to: factory: 'user' key: 'user_ids' type: 'ids[]'
Custom Factories
Coffeescript:
# Custom factories can be defined with a function Factorydefine 'two users and a random number' Factorycreate 'user' Factorycreate 'user' randomNum = ~~Mathrandom*10 callbackuser1user2randomNum # Using it: Factorycreate 'two users and a random number' # Custom attributes will be passed through to # custom factories after callback parameter: Factorydefine 'helloworld' data = "Hello World" if options?caps return callbackdatatoUpperCase callbackdata Factorycreate 'helloworld' # string == 'Hello World' Factorycreate 'helloworld'caps:true # string == 'HELLO WORLD'
Getting attributes with attributesFor
Coffeescript:
# Get raw object of attributes FactoryattributesFor 'user' # Specify some options FactoryattributesFor 'user'name: "Bob"
License
WTFPL v2