Probar el contenido de un elemento temporal con transportador

Estoy tratando de probar la página de inicio de sesión en mi sitio usando transportador.

Si inicia sesión incorrectamente, el sitio muestra un mensaje "brindis" que aparece durante 5 segundos y luego desaparece (usando$timeout)

Estoy usando la siguiente prueba:

  describe('[login]', ()->
    it('should show a toast with an error if the password is wrong', ()->

      username = element(select.model("user.username"))
      password = element(select.model("user.password"))
      loginButton = $('button[type=\'submit\']')
      toast = $('.toaster')

      # Verify that the toast isn't visible yet
      expect(toast.isDisplayed()).toBe(false)

      username.sendKeys("admin")
      password.sendKeys("wrongpassword")
      loginButton.click().then(()->
        # Verify that toast appears and contains an error
        toastMessage = $('.toast-message')
        expect(toast.isDisplayed()).toBe(true)
        expect(toastMessage.getText()).toBe("Invalid password")
      )
    )
  )

El marcado relevante (jade) está abajo:

.toaster(ng-show="messages.length")
  .toast-message(ng-repeat="message in messages") {{message.body}}

El problema es eltoastMessage la prueba está fallando (no puede encontrar el elemento). Parece estar esperando que la tostada desaparezca yentonces ejecutando la prueba.

También he intentado poner eltoastMessage prueba fuera delthen() devolución de llamada (creo que esto es bastante redundante de todos modos), pero obtengo exactamente el mismo comportamiento.

Mi mejor conjetura es que el transportador ve que hay un$timeout corriendo, y espera a que termine antes de ejecutar la próxima prueba (ref.flujo de control del transportador) ¿Cómo podría evitar esto y asegurarme de que la prueba se ejecutedurante el tiempo de espera?

Actualizar:

Siguiendo la sugerencia a continuación, utilicébrowser.wait() esperar a que el brindis sea visible, luego traté de ejecutar la prueba cuando se resolvió la promesa. No funcionó.

console.log "clicking button"
loginButton.click()

browser.wait((()-> toast.isDisplayed()),20000, "never visible").then(()->
  console.log "looking for message"
  toastMessage = $('.toaster')
  expect(toastMessage.getText()).toBe("Invalid password")
)

Las declaraciones de console.log me permiten ver lo que está sucediendo. Esta es la serie de eventos, el[] son lo que veo que sucede en el navegador.

clicking button
[toast appears]
[5 sec pass]
[toast disappears]
looking for message
[test fails]

Para mayor claridad sobre lo que está sucediendo con la tostadora: tengo un servicio que esencialmente contiene una variedad de mensajes. La directiva de brindis siempre está en la página (la plantilla es el jade anterior) y observa los mensajes en el servicio de brindis. Si hay un nuevo mensaje, ejecuta el siguiente código:

scope.messages.push(newMessage)
# set a timeout to remove it afterwards.
$timeout(
()-> 
  scope.messages.splice(0,1) 
, 
  5000
)

Esto empuja el mensaje a la matriz de mensajes en el alcance durante 5 segundos, que es lo que hace que aparezca la tostada (a través deng-show="messages.length")

¿Por qué el transportador está esperando el brindis?$timeout caducar antes de pasar a las pruebas?

Respuestas a la pregunta(5)

Su respuesta a la pregunta