我发现自己有时在某些特定情况下需要这种模式,但在阅读代码时我并不经常看到它。我想知道这是否是推荐的模式,或者是否有更好/更常见的方法来完成同样的事情。也许更现代的方式在ES6中做同样的事情?
示例:
const state = {}
const stubs = {}
const query = () => {
stubs.collection = sinon.stub().callsFake( (collection) => {
state.collection = collection
return this
})
stubs.orderBy = sinon.stub().callsFake( (orderBy, direction) => {
state.orderBy = orderBy
state.direction = direction
return this
})
stubs.limit = sinon.stub().callsFake( (limit) => {
state.limit = limit
return this
})
stubs.get = sinon.stub().callsFake( () => {
const query = state
state = {}
const data = getQuery(query, mockDb)
return data
})
this.collection = stubs.collection
this.orderBy = stubs.orderBy
this.limit = stubs.limit
this.get = stubs.get
return this
}
stubs.firestore = sinon.stub(firebase, 'firestore').get( () => query )
基本上我在这种情况下使用它的原因是我不得不查询"查询"火基单元测试方法。它必须在像firebase.firestore().collection('users').orderBy('timestamp').limit(10).get()
这样的链中工作。我乱了五个小时,无法找到另一种有效的方法。
没有存根部分的例子是:
const query = () => {
this.collection = () => {/*something...*/ return this}
this.orderBy = () => {/*something...*/ return this}
this.limit = () => {/*something...*/ return this}
this.get = () => {/*something...*/ return this}
return this
}
我不确定为什么我真的需要写这样的东西,如果我不需要短信,这只是一个例子,让我更清楚我在说什么关于没有存根的部分。