Skip to content

Commit

Permalink
Merge branch 'deeplyNestedProxyObjects' of git://github.com/lgandecki…
Browse files Browse the repository at this point in the history
…/testdouble.js into lgandecki-deeplyNestedProxyObjects
  • Loading branch information
searls committed Feb 3, 2019
2 parents c757496 + 20df4fe commit c10552b
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,22 @@ var createTestDoublesForFunctionNames = (names) =>

var createTestDoubleViaProxy = (name, config) => {
ensureProxySupport(name)
const obj = {}
return new Proxy(obj, {
get (target, propKey, receiver) {
if (!obj.hasOwnProperty(propKey) && !_.includes(config.excludeMethods, propKey)) {
obj[propKey] = tdFunction(`${nameOf(name)}.${String(propKey)}`)
}
return obj[propKey]
}

const generateHandler = (internalName) => ({
get: (target, propKey) => generateGet(target, propKey, internalName)
})

const generateGet = (target, propKey, internalName) => {
if (!target.hasOwnProperty(propKey) && !_.includes(config.excludeMethods, propKey)) {
let nameWithProp = `${nameOf(internalName)}.${String(propKey)}`
const obj = tdFunction(nameWithProp)
target[propKey] = new Proxy(obj, generateHandler(nameWithProp))
}
return target[propKey]
}

const obj = {}
return new Proxy(obj, generateHandler(name))
}

var ensureProxySupport = (name) => {
Expand Down
31 changes: 31 additions & 0 deletions test/safe/object.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,37 @@ module.exports = {
} catch (e) {
assert._isEqual(e.message, "Error: testdouble.js - td.object - The current runtime does not have Proxy support, which is what\ntestdouble.js depends on when a string name is passed to `td.object()`.\n\nMore details here:\n https://github.com/testdouble/testdouble.js/blob/master/docs/4-creating-test-doubles.md#objectobjectname\n\nDid you mean `td.object(['Woah'])`?")
}
},
'Allow for deeply nested test double objects' () {
if (!global.Proxy) return
testDouble = td.object()

td.when(testDouble.something.very.deeply.nested()).thenReturn('nay!')

assert._isEqual(testDouble.something.very.deeply.nested(), 'nay!')
assert._isEqual(testDouble.something.very.deeply.nested.toString(), '[test double for ".something.very.deeply.nested"]')
},
'Deeply nested test double objects work also when its property names are repeated' () {
if (!global.Proxy) return
testDouble = td.object()

td.when(testDouble.something()).thenReturn('Original Something')
td.when(testDouble.different.something()).thenReturn('Different Something')

assert._isEqual(testDouble.something(), 'Original Something')
assert._isEqual(testDouble.different.something(), 'Different Something')
},
'Resets all deeply nested test doubles with td.reset' () {
if (!global.Proxy) return
testDouble = td.object()

td.when(testDouble.something()).thenReturn('Original Something')
td.when(testDouble.different.something()).thenReturn('Different Something')

td.reset()

assert._isEqual(testDouble.something(), undefined)
assert._isEqual(testDouble.different.something(), undefined)
}
}
}

0 comments on commit c10552b

Please sign in to comment.