es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Las pruebas de Clojure fallan para valores esperados y actuales idénticos.

Estoy haciendo un ejercicio de Clojure que básicamente simula una fábrica de ensamblaje de coches. El siguiente código es mi código de “producción”.

(ns cars-assemble)

(def success-rate-frequencies [
  { :id 1 :interval #(= % 0), :rate 0 }
  { :id 2 :interval #(and (> % 0) (<= % 4)), :rate (/ 100 100) }
  { :id 3 :interval #(and (>= % 5) (<= % 8)), :rate (/ 90 100) }
  { :id 4 :interval #(= % 9), :rate (/ 80 100) }
  { :id 5 :interval #(>= % 10), :rate (/ 77 100) }
])

(defn get-rate-by-speed-interval [speed]
  (let [result (first (filter #((get % :interval) speed) success-rate-frequencies))]
    (get result :rate)))

(defn production-rate
  "Returns the assembly line's production rate per hour,
   taking into account its success rate"
  [speed]
  (float (* speed (* 221 (get-rate-by-speed-interval speed)))))

(defn working-items
  "Calculates how many working cars are produced per minute"
  [speed]
  (let [production-rate (production-rate speed)]
    (if (= speed 0) 0 (int (/ production-rate 60)))))

Mis problemas son que, por alguna razón, cuando ejecuto las pruebas, el código de producción devuelve el valor correcto, pero las pruebas aún fallan. A continuación, tengo mi ejemplo de prueba.

(deftest production-rate-speed-10-test
  (testing "Production rate for speed 10"
    (is (= 1701.7 (cars-assemble/production-rate 10)))))

Aquí está la salida de mi comando lein test:

FAIL in (production-rate-speed-10-test) (cars_assemble_test.clj:27)
Production rate for speed 10
expected: (= 1701.7 (cars-assemble/production-rate 10))
  actual: (not (= 1701.7 1701.7))

Intenté verificar si tenía algún tipo de carácter oculto, pero no encontré nada.

Otra cosa que intenté fue modificar manualmente el archivo de pruebas convirtiendo el valor esperado en float (como se muestra en el ejemplo a continuación). Pero no se supone que cambie mi archivo de pruebas.

(is (= (float 1701.7) (cars-assemble/production-rate 10)))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar con la función working-items, la cual es llamada dentro de production-rate. Podrías intentar añadir una prueba específica para working-items y ver si pasa o falla.

    En cuanto a la prueba fallida para production-rate, parece que el valor actual devuelto es el mismo que el valor esperado, pero la aserción falla. Esto podría deberse a un problema de precisión con números de coma flotante. Una solución podría ser usar la aserción is-close en lugar de is, la cual te permite especificar una tolerancia de qué tan cerca deben estar los valores:

    (deftest production-rate-speed-10-test
      (testing "Tasa de producción para velocidad 10"
        (is-close 1701.7 (cars-assemble/production-rate 10) 0.01)))
    

    Esto comprobaría que el valor esperado esté dentro de 0.01 del valor actual.

    Otra solución podría ser redondear el valor esperado y actual a un número determinado de decimales:

    (deftest production-rate-speed-10-test
      (testing "Tasa de producción para velocidad 10"
        (is (= (round 1701.7 2) (round (cars-assemble/production-rate 10) 2))))) 
    

    Esto comprobaría que el valor esperado y actual sean iguales cuando se redondeen a 2 decimales.

    Asegúrate de revisar la precisión de tus números de coma flotante y ver si eso podría estar causando el problema.

Comments are closed.