Quizzes y Evaluaciones
Sección titulada «Quizzes y Evaluaciones»Sistema completo de evaluaciones que permite a los administradores crear quizzes de opción múltiple y a los estudiantes demostrar su aprendizaje.
Setup para Desarrolladores
Sección titulada «Setup para Desarrolladores»Configuración Inicial
Sección titulada «Configuración Inicial»Si estás configurando el sistema de quizzes por primera vez:
Opción A: Base de Datos Nueva (Recomendado)
Sección titulada «Opción A: Base de Datos Nueva (Recomendado)»cd app/
# Resetear database y aplicar todas las migracioneswasp db reset
# Poblar con datos de prueba (cursos + quizzes + usuarios)wasp db seed seedAllDummyDataOpción B: Base de Datos Existente
Sección titulada «Opción B: Base de Datos Existente»cd app/
# Aplicar solo la migración de quizzeswasp db migrate-dev
# Opcionalmente, agregar quizzes de pruebawasp db seed seedDummyQuizzesTablas Creadas
Sección titulada «Tablas Creadas»La migración crea 4 tablas:
Quiz- Definiciones de quizzesQuizQuestion- Preguntas de cada quizQuizAnswer- Opciones de respuestaQuizAttempt- Intentos de usuarios y puntuaciones
Datos de Prueba
Sección titulada «Datos de Prueba»El seed seedAllDummyData o seedDummyQuizzes crea:
- 2 quizzes por curso (primeros 2 cursos):
- “Quiz de Introducción” - Vinculado a la primera lección (3 preguntas)
- “Examen Final” - Examen final sin lección específica (2 preguntas)
Para Administradores
Sección titulada «Para Administradores»Cómo Crear un Quiz
Sección titulada «Cómo Crear un Quiz»Paso 1: Acceder a la Gestión de Quizzes
Sección titulada «Paso 1: Acceder a la Gestión de Quizzes»- Inicia sesión como administrador
- Ve a Admin → Cursos (
/admin/courses) - Haz clic en “Editar” en el curso donde quieres agregar el quiz
- En la página de edición del curso, haz clic en el botón “Quizzes”
- O navega directamente a
/admin/courses/:courseId/quizzes
- O navega directamente a
Paso 2: Crear Nuevo Quiz
Sección titulada «Paso 2: Crear Nuevo Quiz»- Haz clic en ”+ Crear Quiz”
- Completa el formulario básico:
| Campo | Descripción | Ejemplo |
|---|---|---|
| Título | Nombre del quiz (requerido) | “Quiz de Introducción” |
| Descripción | Explicación opcional del contenido | ”Evalúa conceptos básicos” |
| Orden | Posición en el curso (1, 2, 3…) | 1 |
| Lección Asociada | Vincular a lección específica (opcional) | “Lección 1: Introducción” |
| Puntuación | % mínimo para aprobar (0-100) | 70 (default) |
| Límite de Tiempo | Minutos permitidos (vacío = sin límite) | 15 o dejar vacío |
| Es Requerido | ¿Obligatorio para avanzar? (toggle) | ☑ / ☐ |
| Es Examen Final | ¿Marcar como examen final del curso? | ☐ (solo para examen final) |
Paso 3: Agregar Preguntas
Sección titulada «Paso 3: Agregar Preguntas»Después de completar los datos básicos, ve a la sección “Preguntas”:
- Haz clic en ”+ Agregar Pregunta”
- Para cada pregunta, completa:
| Campo | Descripción | Ejemplo |
|---|---|---|
| Pregunta | Texto de la pregunta (requerido) | “¿Qué es Data Engineering?” |
| Explicación | Explicación mostrada tras responder | ”Data Engineering se enfoca en…” |
-
Agregar Respuestas (mínimo 2):
- Texto de la respuesta
- Toggle “Correcta” para marcar la respuesta correcta
- Mínimo 2 respuestas, máximo ilimitado
- Debe haber al menos UNA respuesta correcta por pregunta
-
Puedes eliminar respuestas haciendo clic en el ícono 🗑️ (mínimo 2 deben permanecer)
Paso 4: Guardar el Quiz
Sección titulada «Paso 4: Guardar el Quiz»-
Haz clic en “Guardar Quiz”
-
El sistema validará:
- ✅ Título no vacío
- ✅ Al menos 1 pregunta
- ✅ Cada pregunta tiene al menos 2 respuestas
- ✅ Cada pregunta tiene al menos 1 respuesta correcta
- ✅ Todas las respuestas tienen texto
-
Si hay errores, aparecerá un mensaje rojo con la validación fallida
-
Si todo está correcto, verás “Quiz guardado correctamente”
Ejemplo Completo: Quiz de Introducción
Sección titulada «Ejemplo Completo: Quiz de Introducción»📝 Título: Quiz de Introducción a Python📄 Descripción: Evalúa tu comprensión de los conceptos básicos de Python🔢 Orden: 1📚 Lección: Lección 1 - Introducción a Python✅ Puntuación: 70%⏱️ Tiempo límite: (sin límite)🔒 Requerido: Sí🏆 Examen final: No
❓ Pregunta 1: "¿Qué es Python?" ℹ️ Explicación: "Python es un lenguaje de programación interpretado..."
Respuestas: ☑️ "Un lenguaje de programación interpretado" (CORRECTA) ☐ "Una base de datos" ☐ "Un framework web" ☐ "Un editor de texto"
❓ Pregunta 2: "¿Cuál es la extensión de archivos Python?" ℹ️ Explicación: ".py es la extensión estándar para archivos Python"
Respuestas: ☐ ".python" ☑️ ".py" (CORRECTA) ☐ ".pt" ☐ ".pyt"
❓ Pregunta 3: "¿Python es case-sensitive?"
Respuestas: ☑️ "Sí" (CORRECTA) ☐ "No"Cómo Editar un Quiz
Sección titulada «Cómo Editar un Quiz»-
Ve a
/admin/courses/:courseId/quizzes -
En la lista de quizzes, haz clic en el botón ✏️ Editar
-
Modifica cualquier campo:
- Detalles del quiz: título, descripción, configuración
- Preguntas existentes: edita texto, explicación, respuestas
- Agregar nuevas preguntas: botón ”+ Agregar Pregunta”
- Eliminar preguntas: botón 🗑️ en cada pregunta
-
Haz clic en “Guardar Quiz”
Cómo Eliminar un Quiz
Sección titulada «Cómo Eliminar un Quiz»- Ve a
/admin/courses/:courseId/quizzes - Haz clic en el botón 🗑️ junto al quiz
- Confirma la eliminación
Ver Estadísticas
Sección titulada «Ver Estadísticas»En la lista de quizzes (/admin/courses/:courseId/quizzes), cada quiz muestra:
| Métrica | Descripción |
|---|---|
| Preguntas | Número de preguntas en el quiz |
| Intentos | Total de intentos de usuarios |
| % Aprobación | Porcentaje para aprobar |
| Orden | Posición en el curso |
Tipos de Quizzes Recomendados
Sección titulada «Tipos de Quizzes Recomendados»1. Quiz de Lección (Knowledge Check)
Sección titulada «1. Quiz de Lección (Knowledge Check)»- Lección asociada: Sí
- Preguntas: 3-5
- Tiempo límite: Sin límite
- Requerido: No
- Finalidad: Reforzar conceptos de la lección
2. Quiz de Módulo
Sección titulada «2. Quiz de Módulo»- Lección asociada: No (o última del módulo)
- Preguntas: 8-12
- Tiempo límite: 20 minutos
- Requerido: Sí
- Finalidad: Evaluar comprensión del módulo completo
3. Examen Final
Sección titulada «3. Examen Final»- Lección asociada: No
- Preguntas: 15-25
- Tiempo límite: 45-60 minutos
- Requerido: Sí
- Es Examen Final: ☑️
- Puntuación: 80%
- Finalidad: Certificar dominio del curso
Mejores Prácticas
Sección titulada «Mejores Prácticas»Diseño de Preguntas
Sección titulada «Diseño de Preguntas»✅ Buenas Preguntas
- Claras y concisas
- Evalúan comprensión, no memorización
- Una sola respuesta correcta clara
- Distractores plausibles pero incorrectos
❌ Evitar
- Preguntas ambiguas o confusas
- Truco questions (muy similares entre sí)
- Respuestas obvias o ridículas
- Preguntas de “doble negativo”
Ejemplos
Sección titulada «Ejemplos»❌ Mala Pregunta:
"¿No es cierto que Python no necesita punto y coma?"a) Nob) Síc) Tal vezd) Depende✅ Buena Pregunta:
"¿Qué símbolo se usa para comentarios en Python?"a) //b) /* */c) #d) --Número de Respuestas
Sección titulada «Número de Respuestas»- Mínimo: 2 respuestas (pero se recomienda 4)
- Óptimo: 4 respuestas
- Máximo: Sin límite, pero 6+ puede confundir
Tiempo Límite
Sección titulada «Tiempo Límite»| Tipo de Pregunta | Tiempo Recomendado |
|---|---|
| Opción múltiple basic | 30-45 segundos |
| Análisis de código | 60-90 segundos |
| Quiz completo (10Q) | 15 minutos |
| Examen final (20Q) | 45-60 minutos |
Para Estudiantes
Sección titulada «Para Estudiantes»Cómo Tomar un Quiz
Sección titulada «Cómo Tomar un Quiz»Paso 1: Acceder al Quiz
Sección titulada «Paso 1: Acceder al Quiz»- Inicia sesión en tu cuenta
- Ve a tu curso en Mis Cursos o desde el catálogo
- Haz clic en “Continuar Aprendiendo” o “Ir al Curso”
- En la página de aprendizaje, haz clic en la pestaña “Quizzes” en el sidebar
Paso 2: Ver Detalles del Quiz
Sección titulada «Paso 2: Ver Detalles del Quiz»Antes de comenzar, verás:
| Información | Ejemplo |
|---|---|
| Título | ”Quiz de Python” |
| Descripción | ”Evalúa conceptos” |
| Preguntas | 10 preguntas |
| % Aprobación | 70% |
| Tiempo límite | 15 minutos o ∞ |
| Tu mejor intento | 85% ✅ (si ya tomaste) |
Haz clic en “Comenzar Quiz” o “Reintentar” (si ya lo tomaste).
Paso 3: Responder Preguntas
Sección titulada «Paso 3: Responder Preguntas»-
Lee cada pregunta cuidadosamente
-
Selecciona UNA respuesta haciendo clic en el radio button
-
Navega con los botones:
- ← Anterior: Regresar a la pregunta anterior
- Siguiente →: Ir a la siguiente pregunta
-
Temporizador (si hay límite):
- Se muestra en la esquina superior derecha
- ⏱️ 14:32 restantes
- Alerta cuando queden 2 minutos
- Auto-envío cuando se acabe el tiempo
-
Progreso: Indicador visual de preguntas respondidas
- “Pregunta 3 de 10”
Paso 4: Enviar el Quiz
Sección titulada «Paso 4: Enviar el Quiz»- Después de responder todas las preguntas, aparece el botón “Enviar Quiz”
- Confirma el envío (no se puede cambiar después)
- El quiz se califica automáticamente
Paso 5: Ver Resultados
Sección titulada «Paso 5: Ver Resultados»Inmediatamente después de enviar, verás:
| Sección | Contenido |
|---|---|
| Puntuación | Tu puntaje (%) y si aprobaste |
| Estadísticas | Correctas/Incorrectas, Tiempo empleado |
| Detalles | Pregunta por pregunta con: |
| - Tu respuesta | |
| - Respuesta correcta | |
| - Explicación (si existe) | |
| - ✅ / ❌ indicador | |
| Mejor intento | Tu mejor puntaje histórico |
Ejemplo de Resultados
Sección titulada «Ejemplo de Resultados»🎉 ¡Felicidades! Aprobaste el quiz
Tu Puntuación: 85% ✅Puntuación Mínima: 70%
📊 Estadísticas: ✅ Correctas: 17/20 ❌ Incorrectas: 3/20 ⏱️ Tiempo: 12 min 34 seg
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❓ Pregunta 1: ¿Qué es Python? Tu respuesta: "Un lenguaje de programación" ✅ ℹ️ Correcto! Python es un lenguaje interpretado...
❓ Pregunta 2: ¿Qué es un diccionario en Python? Tu respuesta: "Una lista" ❌ ✅ Respuesta correcta: "Una estructura clave-valor" ℹ️ Un diccionario (dict) almacena pares clave-valor...
[... resto de preguntas ...]
[🔄 Reintentar Quiz] [← Volver al Curso]Reintentar un Quiz
Sección titulada «Reintentar un Quiz»Los quizzes se pueden tomar ILIMITADAMENTE:
- Haz clic en “Reintentar Quiz” en la página de resultados
- O vuelve a la lista de quizzes y selecciona el mismo quiz
- Tu mejor puntaje se guarda automáticamente
- Puedes ver el historial de intentos en tu perfil
Integración con el Sistema
Sección titulada «Integración con el Sistema»Donde Aparecen los Quizzes
Sección titulada «Donde Aparecen los Quizzes»| Ubicación | Vista |
|---|---|
| LearnPage (Sidebar) | Tab “Quizzes” con lista de quizzes |
| QuizCard | Card con info, mejor puntaje, botón |
| QuizPage | Página completa para tomar el quiz |
| QuizResults | Página de resultados detallados |
| Admin Quiz List | Lista de quizzes con estadísticas |
| Admin Quiz Form | Editor completo de quiz |
Flujo Completo
Sección titulada «Flujo Completo»┌─────────────────────────────────────────────────────────────┐│ Admin crea quiz en /admin/courses/:id/quizzes ││ ↓ ││ Quiz aparece en LearnPage → Tab "Quizzes" ││ ↓ ││ Estudiante ve QuizCard con descripción y mejor puntaje ││ ↓ ││ Click "Tomar Quiz" → navega a /quiz/:quizId ││ ↓ ││ QuizPage carga preguntas con QuizComponent ││ ↓ ││ Estudiante responde y envía → submitQuizAttempt ││ ↓ ││ QuizResults muestra puntuación, feedback, explicaciones ││ ↓ ││ Opción de reintentar o volver al curso │└─────────────────────────────────────────────────────────────┘Operaciones del Sistema
Sección titulada «Operaciones del Sistema»Queries (Lectura)
Sección titulada «Queries (Lectura)»| Query | Descripción | Uso |
|---|---|---|
getCourseQuizzes | Obtiene quizzes de un curso (estudiante) | LearnPage sidebar |
getQuizById | Obtiene quiz con preguntas | QuizPage |
getQuizAttempts | Obtiene intentos de usuario | Historial, mejor score |
getAdminQuizzes | Obtiene quizzes (admin con más detalles) | Admin quiz list |
getAdminQuizById | Obtiene quiz para edición | Admin quiz form |
Actions (Escritura)
Sección titulada «Actions (Escritura)»| Action | Descripción | Uso |
|---|---|---|
createQuiz | Crea nuevo quiz | Admin form |
updateQuiz | Actualiza quiz existente | Admin form |
deleteQuiz | Elimina quiz y dependencias | Admin list |
createQuizQuestion | Agrega pregunta con respuestas | Admin form |
updateQuizQuestion | Actualiza pregunta | Admin form |
deleteQuizQuestion | Elimina pregunta | Admin form |
submitQuizAttempt | Registra intento y califica | QuizPage (estudiante) |
Modelos de Base de Datos
Sección titulada «Modelos de Base de Datos»{ id: number courseId: number lessonId?: number | null // null = examen final title: string description?: string order: number passingScore: number // default: 70 timeLimit?: number | null // segundos isRequired: boolean // default: false isFinalExam: boolean // default: false questions: QuizQuestion[] attempts: QuizAttempt[]}QuizQuestion
Sección titulada «QuizQuestion»{ id: number quizId: number question: string order: number explanation?: string // Mostrado tras responder answers: QuizAnswer[]}QuizAnswer
Sección titulada «QuizAnswer»{ id: number; questionId: number; answer: string; isCorrect: boolean; order: number;}QuizAttempt
Sección titulada «QuizAttempt»{ id: number userId: string quizId: number score: number // 0-100 passed: boolean // score >= passingScore timeSpent?: number // segundos answers: string // JSON: { questionId: answerId } createdAt: Date}Seed Data (Desarrollo)
Sección titulada «Seed Data (Desarrollo)»Para poblar la base de datos con quizzes de ejemplo:
wasp db seed seedDummyQuizzesEsto crea:
- 4 quizzes en los primeros 2 cursos
- 2 quizzes por curso:
- “Quiz de Introducción” (3 preguntas, 70% passing)
- “Examen Final” (2 preguntas, 80% passing)
Troubleshooting
Sección titulada «Troubleshooting»Problema: Error 404 en /admin/courses/:courseId/quizzes
Sección titulada «Problema: Error 404 en /admin/courses/:courseId/quizzes»Causa: Problema de orden de rutas (ya resuelto)
Solución:
- Asegúrate de tener la versión más reciente del código
- REINICIA el servidor Wasp (crítico - las rutas se compilan al inicio):
Ventana de terminal # Detener el servidor (Ctrl+C)wasp start - Las rutas de quiz ahora tienen prioridad sobre la ruta genérica de edición de curso
Problema: No encuentro “Gestión de Quizzes” en la página de edición de curso
Sección titulada «Problema: No encuentro “Gestión de Quizzes” en la página de edición de curso»Causa: La sección de quizzes solo aparece para cursos GUARDADOS, no para nuevos
Solución:
- Primero crea y guarda un curso (o usa uno existente)
- Luego haz clic en “Editar” en ese curso
- Desplázate hacia abajo - la sección “Gestión de Quizzes” aparece DEBAJO de “Lecciones”
- Verás un botón “Agregar Quiz” ahí
Problema: Seed falla con “table Quiz does not exist”
Sección titulada «Problema: Seed falla con “table Quiz does not exist”»Causa: La migración de quizzes no se ha aplicado
Solución:
# Aplicar migración primerowasp db migrate-dev
# Luego hacer seedwasp db seed seedAllDummyData
# O usar reset que hace todo automáticamentewasp db resetProblema: “No veo el tab de Quizzes” en la página de aprendizaje
Sección titulada «Problema: “No veo el tab de Quizzes” en la página de aprendizaje»Soluciones:
- Verifica que estés inscrito en el curso o tengas suscripción activa
- Revisa que el curso tenga quizzes creados (como admin)
- Reinicia el dev server:
wasp start - Limpia la caché del navegador (Ctrl+Shift+R)
Problema: “Error 500 al crear quiz”
Sección titulada «Problema: “Error 500 al crear quiz”»Soluciones:
- Verifica que las tablas Quiz existan en la DB:
Ventana de terminal # Conectarse a la DB y listar tablasdocker exec -i wasp-dev-db-[nombre] psql -U postgresWaspDevUser -d [db-name] -c "\dt" - Si faltan tablas, ejecuta:
wasp db migrate-dev - Revisa validaciones del formulario:
- Título no vacío
- Al menos 1 pregunta
- Cada pregunta tiene ≥2 respuestas
- Cada pregunta tiene ≥1 respuesta correcta
Problema: “Las preguntas no se guardan”
Sección titulada «Problema: “Las preguntas no se guardan”»Soluciones:
- Asegúrate de que cada pregunta cumple:
- ✅ Al menos 2 respuestas
- ✅ Al menos 1 respuesta marcada como correcta
- ✅ Texto en todas las respuestas (no vacías)
- Revisa la consola del navegador (F12) para errores JavaScript
- Verifica que no haya errores de red en la pestaña Network
Problema: Errores de compilación TypeScript
Sección titulada «Problema: Errores de compilación TypeScript»Ya resueltos en la versión actual:
- ✅ Componente
radio-groupagregado - ✅ Manejo de
courseIdundefined corregido - ✅ Manejo de
quizIdundefined corregido - ✅ Migrado de
useHistoryauseNavigate(React Router v6) - ✅ Tipos de relación
lessonnullable arreglados
Si ves errores de compilación, asegúrate de tener la última versión del código.
Problema: “No puedo crear quiz como admin”
Sección titulada «Problema: “No puedo crear quiz como admin”»Soluciones:
- Verifica que estés autenticado como admin:
- Email:
admin@talentbricks.ai - Password:
AdminPass123!
- Email:
- El curso debe estar guardado (no puede ser “nuevo”)
- Si acabas de actualizar el código con corrección de rutas, reinicia Wasp
Problema: “Los quizzes no aparecen en cursos”
Sección titulada «Problema: “Los quizzes no aparecen en cursos”»Soluciones:
- Ejecuta el seed:
wasp db seed seedAllDummyData - Verifica que los cursos existan primero
- Revisa que el usuario esté inscrito o tenga suscripción activa
- Comprueba en la tabla Quiz que existan registros:
Ventana de terminal docker exec -i wasp-dev-db-[nombre] psql -U postgresWaspDevUser -d [db-name] -c "SELECT * FROM \"Quiz\";"
Próximas Mejoras
Sección titulada «Próximas Mejoras»Funcionalidades planeadas para futuras versiones:
- Drag & drop para reordenar preguntas
- Tipos de pregunta adicionales (verdadero/falso, llenar espacios)
- Banco de preguntas reutilizables
- Exportar resultados a CSV
- Análisis de preguntas (% de aciertos por pregunta)
- Randomizar orden de preguntas y respuestas
- Preguntas con imágenes
- Certificado requerido: aprobar X quizzes
Recursos Adicionales
Sección titulada «Recursos Adicionales»- Código fuente:
app/src/admin/dashboards/quizzes/yapp/src/courses/components/Quiz*.tsx - Operaciones:
app/src/admin/operations.ts(admin) yapp/src/courses/operations.ts(estudiante) - Schema:
app/schema.prisma(modelos Quiz, QuizQuestion, QuizAnswer, QuizAttempt) - Rutas: Declaradas en
app/main.wasp