L'unità che esegue il test di determinate attività viene eseguita in un processo

0

Ho un codice Scala che desidero testare unitamente con ScalaMock:

class CancellationManagerSpec extends FlatSpec with MockFactory {

  "Cancelling a shipment" should "check shipment is not already shipped" in {

    val manager = mock[CancellationsManager]
    (manager.checkStatus _).expects(*, *).returning(true).once()

    val request = CancellationRequestedEvent("shipmentNumber")
    manager.processCancellation(request)
  }
}

Il test ha esito negativo:

[info] - should complete a series of tasks in happy case *** FAILED ***
[info]   Unexpected call: <mock-6> CancellationsManager.processCancellation(CancellationRequestedEvent(shipmentNumber))
[info]   
[info]   Expected:
[info]   inAnyOrder {
[info]     <mock-6> CancellationsManager.checkStatus(*, *) once (never called - UNSATISFIED)
[info]   }
[info]   
[info]   Actual:
[info]     <mock-6> CancellationsManager.processCancellation(CancellationRequestedEvent(shipmentNumber)) (Option.scala:121)

Voglio testare che quando elaboro un annullamento, alcune attività sono fatte. Più in generale, c'è una logica come questa che vorrei testare:

class SalesOrderShippedProcess {
  def execute(salesOrder: SalesOrder): Unit = {
    if (doTask1() && doTask2()) {
      doTask3()
      doTask4()
      doTask5()
    }
  }

  def doTask1(): Boolean = ???
  def doTask2(): Boolean = ???
  def doTask3(): Boolean = ???
  def doTask4(): Boolean = ???
  def doTask5(): Boolean = ???
}

Per quanto riguarda alcuni processi, desidero verificare che le attività 3, 4 e 5 vengano eseguite solo se l'attività 1 e 2 ha esito positivo e anche se l'attività 3 non riesce, l'attività 4 e 5 deve essere eseguita indipendentemente.

Qual è il modo migliore per testarlo? Sta fallendo perché sto chiamando direttamente un metodo dell'oggetto deriso? Devo spostare tutti i metodi dell'attività nella sua classe e poi deriderla, il che mi sembra un po 'strano solo per poter scrivere un test per questo?

    
posta Robo 22.12.2017 - 15:08
fonte

1 risposta

1

Sì, stai sbagliando, dovresti chiamare un metodo sull'oggetto reale (cioè CancellationsManager nel tuo caso), non sul mock. Quindi il tuo test sarebbe un po 'come:

it should "check the status when an order is cancelled" in {
  val manager = new CancellationManager();
  val request = new CancellationRequestedEvent("shipmentId");

  manager.processCancellation(request);

  (manager.checkStatus _).expects(*, *).returning(true).once()
}

I mazzi sono lì per sostituire le dipendenze dell'oggetto testato, non l'oggetto stesso - ad esempio, se il tuo CancellationManager dipendeva da un ShipmentFinder , prendi in giro il ShipmentFinder così che stai testando solo il codice CancellationManager , non tutte le sue dipendenze pure.

    
risposta data 22.12.2017 - 15:44
fonte

Leggi altre domande sui tag