spectacular
Version:
Advanced BDD framework for CoffeeScript and JavaScript
168 lines (111 loc) • 4.58 kB
text/coffeescript
class Dummy
constructor: (@args...) ->
@property = 'value'
class DummyWithCustomBuild
@new: ->
instance = new DummyWithCustomBuild
instance.property = 'value'
instance
factoryMixin 'has parent', (factory) ->
trait 'with parent', ->
set 'parent', -> create factory.name
factoryMixin 'has field', (factory) ->
set 'field', 'value'
factory 'object', class: Object, ->
set 'property', -> 16
trait 'trait', ->
set 'property', -> 20
set 'name', 'irrelevant'
factory 'object with hooks', class: Object, ->
set 'field', 'value'
after 'build', (obj) ->
obj.field = 'another value'
trait 'trait with hook', ->
after 'build', (obj) ->
obj.field = 'a last value'
factory 'dummy', class: Dummy, ->
include 'has parent'
createWith 'foo', 'bar'
trait 'with createWith', ->
createWith 'bar', 'foo'
trait 'with createWith function', ->
createWith -> ['bar', 'foo']
factory 'dummy', ->
trait 'reopened factory', ->
set 'reopened', true
factory 'dummy2', extends: 'dummy', ->
createWith 'oof', 'rab'
set 'baz', -> 42
factory 'dummy3', class: Dummy, ->
include 'has field'
factory 'dummy_with_custom_build', class: DummyWithCustomBuild, ->
build (cls, args) -> cls.new.apply(cls, args)
trait 'trait', ->
build (cls, args) ->
instance = new cls
instance.foo = 'bar'
instance
describe create, ->
context 'called with nothing', ->
it -> should throwAnError /no factory name provided/
context 'called with inexistant factory', ->
it -> should throwAnError(/missing factory foo/).with 'foo'
context 'called with inexistant trait', ->
it -> should throwAnError(/unknown trait foo/).with 'dummy', 'foo'
context 'called with only a factory', ->
withArguments 'object'
itsReturn -> should equal property: 16
context 'called with a factory and a trait', ->
withArguments 'object', 'trait'
itsReturn -> should equal property: 20, name: 'irrelevant'
context 'called with a factory and an option object', ->
withArguments 'object', name: 'irrelevant'
itsReturn -> should equal property: 16, name: 'irrelevant'
context 'called with a factory that defines constructor arguments', ->
withArguments 'dummy'
itsReturn -> should equal property: 'value', args: ['foo', 'bar']
context 'called with a trait', ->
context 'that defines constructor arguments', ->
withArguments 'dummy', 'with createWith'
itsReturn -> should equal property: 'value', args: ['bar', 'foo']
context 'that defines constructor arguments with a function', ->
withArguments 'dummy', 'with createWith function'
itsReturn -> should equal property: 'value', args: ['bar', 'foo']
context 'called with a trait defined in a reopened factory', ->
withArguments 'dummy', 'reopened factory'
itsReturn -> should equal property: 'value', args: ['foo', 'bar'], reopened: true
context 'called on a factory that defines a custom build', ->
withArguments 'dummy_with_custom_build'
itsReturn -> should equal property: 'value'
context 'with a trait that override the custom build', ->
withArguments 'dummy_with_custom_build', 'trait'
itsReturn -> should equal foo: 'bar'
context 'on a factory decorated with a mixin', ->
withArguments 'dummy3'
itsReturn -> should equal field: 'value', property: 'value', args: []
context 'called with an included trait', ->
subject -> create 'dummy', 'with parent'
its 'parent', -> should exist
context 'on a factory that defines hooks', ->
withArguments 'object with hooks'
itsReturn -> should equal field: 'another value'
context 'with a trait that defines hook', ->
withArguments 'object with hooks', 'trait with hook'
itsReturn -> should equal field: 'a last value'
describe factory, ->
context 'when using the extends option', ->
context 'the created object', ->
subject -> create 'dummy2'
it -> should exist
it 'inherit from the parent factory', ->
should equal property: 'value', args: ['oof', 'rab'], baz: 42
runningSpecs('a factory without a class')
.shouldStopWith /no class provided/, ->
factory 'no_class', ->
runningSpecs('a factory extending an unexistant factory')
.shouldStopWith /parent factory 'bar' can't be found/, ->
factory 'no_parent', extends: 'bar', ->
runningSpecs('a factory including an unexistant mixin')
.shouldStopWith /mixin 'bar' can't be found/, ->
factory 'undefined_mixin', class: Object, ->
include 'bar'