在 Redux ORM QuerySet 上执行映射和过滤器问题
Issue doing map and filter on Redux ORM QuerySet
我正在做 redux-orm 的教程 here 我需要在测试中的 QuerySet 实例上调用 map
。
回购中的原始测试是here
这就是我创建 Todo
:
的方式
const todoTags = 'testing,nice,cool'
const user = session.User.first()
const userId = user.getId()
const action = {
type: CREATE_TODO,
payload: {
text: todoText,
tags: todoTags,
user: userId
}
}
const { Todo, Tag, User } = applyActionAndGetNextSession(schema, state, action)
我的代码如下所示:
const newTodo = Todo.last()
console.log(newTodo.tags.forEach, newTodo.tags.map)
console.log('Print all tags')
newTodo.tags.forEach(tag => {
console.log('Prints a tag')
console.log(tag)
})
newTodo.tags.map(tag => {
console.log('Prints a tag 2')
console.log(tag)
return tag
})
expect(newTodo.text).toEqual(todoText)
expect(newTodo.user.getId()).toEqual(userId)
expect(newTodo.done).toBeFalsy()
const newTodoTags = newTodo.tags.map(tag => tag.name)
console.log(newTodoTags)
expect(newTodoTags).toEqual(['testing','nice','cool'])
Tag
模型看起来像:
Tag.backend = {
idAttribute: 'name'
}
我可以使用
检索名称,恰好是此模型的 ids
newTodo.tags.idArr
这是骇人听闻且不可接受的。
测试失败,这是我
的控制台输出
console.log(newTodo.tags)
//OUTPUT
QuerySet {
...
idArr: ['testing', 'nice', 'cool']
...
}
console.log(newTodo.tags.forEach, newTodo.tags.map)
//OUTPUT
[ Function forEach] [Function map]
console.log(newTodo.tags.toRefArray())
//OUTPUT
[undefined, undefined, undefined]
console.log('Print all tags')
newTodo.tags.forEach(tag => {
console.log('Prints a tag')
console.log(tag)
})
newTodo.tags.map(tag => {
console.log('Prints a tag 2')
console.log(tag)
return tag
})
//OUTPUT
Prints all tags
console.log(newTodo.tags.withModels)
//Output is a QuerySet
newTodo.tags.withModels.map(tag => {
console.log('mapping over tag models')
console.log(tag)
return tag
}
回复@markerikson 评论:
case CREATE_TODO:
const tags = payload.tags.split(',')
const trimmed = tags.map(tag => tag.trim())
trimmed.forEach(tag => Tag.create(tag))
break
在 Tag
模型中处理 reducer 中的字符串。 Todo
和 Tag
的代码都是 here
正如我在评论中所建议的那样:您没有正确创建 Tag 实例。看起来您正在将每个单独的标记字符串直接传递给 Tag.create()
,所以它就像 Tag.create("testing")
。相反,您需要传递一个 对象 ,例如 Tag.create({name : "testing"})
。
我正在做 redux-orm 的教程 here 我需要在测试中的 QuerySet 实例上调用 map
。
回购中的原始测试是here
这就是我创建 Todo
:
const todoTags = 'testing,nice,cool'
const user = session.User.first()
const userId = user.getId()
const action = {
type: CREATE_TODO,
payload: {
text: todoText,
tags: todoTags,
user: userId
}
}
const { Todo, Tag, User } = applyActionAndGetNextSession(schema, state, action)
我的代码如下所示:
const newTodo = Todo.last()
console.log(newTodo.tags.forEach, newTodo.tags.map)
console.log('Print all tags')
newTodo.tags.forEach(tag => {
console.log('Prints a tag')
console.log(tag)
})
newTodo.tags.map(tag => {
console.log('Prints a tag 2')
console.log(tag)
return tag
})
expect(newTodo.text).toEqual(todoText)
expect(newTodo.user.getId()).toEqual(userId)
expect(newTodo.done).toBeFalsy()
const newTodoTags = newTodo.tags.map(tag => tag.name)
console.log(newTodoTags)
expect(newTodoTags).toEqual(['testing','nice','cool'])
Tag
模型看起来像:
Tag.backend = {
idAttribute: 'name'
}
我可以使用
检索名称,恰好是此模型的ids
newTodo.tags.idArr
这是骇人听闻且不可接受的。
测试失败,这是我
的控制台输出console.log(newTodo.tags)
//OUTPUT
QuerySet {
...
idArr: ['testing', 'nice', 'cool']
...
}
console.log(newTodo.tags.forEach, newTodo.tags.map)
//OUTPUT
[ Function forEach] [Function map]
console.log(newTodo.tags.toRefArray())
//OUTPUT
[undefined, undefined, undefined]
console.log('Print all tags')
newTodo.tags.forEach(tag => {
console.log('Prints a tag')
console.log(tag)
})
newTodo.tags.map(tag => {
console.log('Prints a tag 2')
console.log(tag)
return tag
})
//OUTPUT
Prints all tags
console.log(newTodo.tags.withModels)
//Output is a QuerySet
newTodo.tags.withModels.map(tag => {
console.log('mapping over tag models')
console.log(tag)
return tag
}
回复@markerikson 评论:
case CREATE_TODO:
const tags = payload.tags.split(',')
const trimmed = tags.map(tag => tag.trim())
trimmed.forEach(tag => Tag.create(tag))
break
在 Tag
模型中处理 reducer 中的字符串。 Todo
和 Tag
的代码都是 here
正如我在评论中所建议的那样:您没有正确创建 Tag 实例。看起来您正在将每个单独的标记字符串直接传递给 Tag.create()
,所以它就像 Tag.create("testing")
。相反,您需要传递一个 对象 ,例如 Tag.create({name : "testing"})
。