WebHU - Programozási kérdések és válaszok

Nem sikerült menteni a Teszt a vezérlőn alatt

Régóta küzdök ezzel, és úgy tűnik, ez egy gyakori probléma, és nincs számomra megfelelő megoldás.

Amit próbálok tenni, az az, hogy tesztelem a save()-t meghívó vezérlőt, és a save()-on belül a metódus meghív egy szolgáltatást, amely a megadott parancsobjektumokkal menti az alkalmazottat.

Így néz ki a kód:

 def save(EmployeeInputCommand employeeCommand, AddressCommand addressCommand) { 
    if (addressCommand.address.validate()) {
        println "Validated address input"
        employeeManagerService.save(employeeCommand, addressCommand)
        println "Employee should be saved"
        println "------------------------->"
        println "${employeeGetterService.each {errors}}"
        flash.message = "Employee has been successfully created!"
        redirect(action: "index")
    } else {
        println "Addrescommand didnt validate: ${addressCommand.errors}"
        flash.message = "Please input valid data!!!"
        redirect(action: "create", model: [employee: employeeCommand, address: addressCommand])
    }
}

A szolgáltatás ezt tartalmazza:

def save(EmployeeInputCommand employeeCommand, AddressCommand addressCommand) {
    def employee = new Employee(employeeCommand.properties)
    employee.address = addressCommand.address
    for (id in employeeCommand.s) {
        employee.addToSkills(Skill.get(id))
    }
    if (employee.validate()) {
        employee.address.save()
        employee.save()
    }
    else {
       return false
    }
}

Tudom, hogy ez működik, amikor megpróbálom ténylegesen menteni az alkalmazottat az alkalmazásomba, de az egységteszt során semmi sem történik.

Tesztem:

     def "Create an Employee with good params"() {
    given: "A valid employee command object"
    def employeeCommand = new EmployeeInputCommand(
            name: "John",
            surname: "Smith",
            birthdate: Date.parse("yyyy-MM-dd", "1992-06-08"),
            salary: 21000,
            s: [1, 3, 5]
    )

    and: "Also a valid address command object"
    def addressCommand = new AddressCommand(
            street: "Green Alley",
            houseid: "42",
            city: "Odense",
            county: "Fyn",
            postCode: "5000 C"
    )

    expect:
    addressCommand.validate()
    !Employee.findByNameAndSurname("John", "Smith")

    when: "Saving employee"
    request.method = "POST"
    controller.save(employeeCommand, addressCommand)
    Employee employee = Employee.findByNameAndSurname("John", "Smith")

    println Employee.list()

    then: "The employee is created, and browser redirected"
    Employee.count == 4
    employee
    employee.skills.size() == 3
    employee.address.postCode == "5000 C"
}

A kontroller.save() meghívásakor a teszt null hibával sikertelen. Túl sok időt töltöttem azzal, hogy ezt megoldjam, ami hiábavaló volt

Ez a kimeneti képernyőkép

Hibakimenet


Válaszok:


1

Nem hiszem, hogy egy vezérlő tesztelésének ki kellene terjednie a szolgáltatási logikára. Én kigúnyolnám a szolgáltatást, ha egységtesztet írnék egy vezérlőhöz, és külön tesztelném a szolgáltatást a saját egység/integrációs tesztjeiben. Például:

/*
 * in controller spec
 */
def setup() {
  def serviceMock = new MockFor(EmployeeManagerService)
  serviceMock.ignore('save') { ec, ac ->
    Employee.buildWithoutSave().save(validate: false)
  }
  serviceMock.use {
    controller.employeeManagerService = new EmployeeManagerService()
  }
}

def 'testFoo'() {
  when:
  // ...
  controller.employeeManagerService.save()
  // ...
  then:
  // ...
}

Vegye figyelembe, hogy a kód a kiváló Build Test Data beépülő modult használja.

20.05.2015
  • Igen, ez így van, és nem próbálok tesztelni egy szolgáltatást a vezérlőben. A cél az időjárás tesztelése, amelyet a vezérlő gúnyolt szolgáltatásnak hívhat, ami megmenti az alkalmazottat. De a probléma abban rejlik, hogy megfelelően megcsúfolják a szolgáltatást a teszt elvégzéséhez, és a jövőbeni tesztekhez, amelyek megcsúfolt szolgáltatásokat igényelnek. 20.05.2015
  • Látom. Frissítettem a kódot, hogy képet kapjon arról, hogyan teheti meg, amire szüksége van. 20.05.2015

  • 2

    Szerintem a probléma az egységtesztelés szolgáltatásával van. Az egységteszteknél defineBeans záróelem szükséges a tavaszi bab használatához-

    void "test the filter"() {
        setup:
        defineBeans {
            employeeManagerService(EmployeeManagerService) { bean ->
                bean.autowire = true
            }
        }
    
        when:
        ...
    
        then:
        ...
    }
    

    Ref# Inject Services in Grails Unit Test

    20.05.2015

    3

    A teszteket integrációs tesztként kell végrehajtania, nem egységtesztként. Az integrációs tesztelésre akkor van szükség, ha adatbázissal kapcsolatos logikát (CRUD-műveleteket) tesztel, nem csak a CRUD-műveletek kigúnyolására, amit az egységtesztek tesznek.

    20.05.2015
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..