object-factory

Build/share/create reusable factories

Create and distribute test fixtures/factories.

All examples assume you have required object-factory like this:

var Factory = require('object-factory');
function Event(props) {
  this.title = props.title;
  this.location = props.location;
}
 
var EventFactory = new Factory({
  object: Event
  properties: {
    // define defaults 
    title: 'Amazing Event',
    location: 'Bahamas'
  }
});
 
// create an object with the attributes of the factory but not an 
// instance of the Event class 
var event = EventFactory.build({ 
  title: 'xxx' 
});
 
// Create an instance of the event class 
var event = EventFactory.create({ 
  title: 'xxx' 
});
 

When creating factories there are various options that can be passed.

new Factory({ 
  properties: {
    key: 'default value
    '
  } 
});

The .properties property (sorry) specify the default values for a given factory.

 
var MyThing = new Factory({ 
  object: ThingWithConstructorThatAcceptsObjects
});

As the fictional object might suggest object is the object that the factories properties are passed into...

// This operation 
 
MyThing.create({ xfoo: true });
 
// Translates to this 
new ThingWithConstructorThatAcceptsObjects({ xfoo: true })

The onbuild property will be called if given before the generated properties are passed to the constructor .object.

var BuildMe = new Factory({
  onbuildfunction(builtObject) {
    // use this to customize the output of your factory for dynamic 
    // values, etc... 
  }
})

The oncreate property will be called if given after the generated properties are passed to the constructor .object.

var BuildMe = new Factory({
  object: Xfoo
  oncreatefunction(object) {
    // (object instanceof Xfoo) === true 
  }
})

You can't create abritrarty depth in a factory. Each factory must be one object deep but multiple factories can be referenced as properties to create this nesting.

 
var Person = new Factory({
  properties: {
    name: 'James Lal'  
  }
});
 
var Event = new Factory({
  properties: {
    // define defaults 
    title: 'Amazing Event',
    location: 'Bahamas',
    person: Person
  }
});

Factories can inherit from other factories:

 
var Developer = Person.extend({
  properties: {
    OCD: true  
  }
});

object factory ships with a object-factory-viewer binary which will pretty print the output of your factory given a module.

// xfoo.js 
module.exports = new Factory({
  properties: { xfoo: 'foo' }
});
./node_modules/.bin/object-factory-viewer xfoo.js
# will output the pretty printed (util.inspect) version of the factory. 

If your not using .onbuild or .oncreate then this is a great way to test the output of your factories. This serves as a good sanity check (and could be used as documentation too).