Ich benutze Grails 2.3.7. Ich habe ein einfaches Person Domain-Objekt:Mocking statisch Get Gorm-Methode in Grails Unit-Test
class Person {
String name
static constraints = {}
}
Und Controller:
@Transactional(readOnly = true)
class PersonController {
def index() {
render view:'index', model:[personList:Person.list()]
}
def show(Long id) {
def person = Person.get(id)
render view:'show', model:[person:person]
}
...
}
Ich versuche, einen Komponententest zu schreiben für die Steuerung der show
Verfahren auszuüben, aber ich bin nicht sicher, wie ich Sie müssen den Test konfigurieren, um sicherzustellen, dass der statische Aufruf Person.get(id)
einen Wert zurückgibt.
Hier ist meine (Fehler) Versuch:
import grails.test.mixin.*
import spock.lang.*
@TestFor(PersonController)
@Mock(Person)
class PersonControllerSpec extends Specification {
void "Test show action loads Person by id and includes that person in the model rendered"() {
setup:
def personMockControl = mockFor(Person)
personMockControl.demand.static.get() { int id -> new Person(name:"John") }
when:"A valid person id passed to the show action"
controller.show(123)
then:"A model is populated containing the person domain instance loaded by that unique id"
model.person != null
model.person.name == "John"
}
}
Dieser Test schlägt fehl, da die Bedingung model.person != null
ausfällt. Wie schreibe ich diesen Test um, um ihn zu bestehen?
EDIT
In diesem Fall kann ich die statischen Methodenaufruf neben Schritt für den Test Nacharbeiten thusly:
void "Test show action loads Person by id and includes that person in the model rendered"() {
setup:
def p = new Person(name:"John").save()
when:"A valid person id passed to the show action"
controller.show(p.id)
then:"A model is populated containing the person domain instance loaded by that unique id"
model.person != null
model.person.id == p.id
model.person.name == "John"
}
Aber ich würde wirklich verstehen möchte, wie man richtig die verspotten Person
' s statische get
Methode.
EDIT 2
Hier ist eine andere Situation meine empfundene Notwendigkeit zu zeigen, die get
Methode zu verspotten. Vor diesem Filtercode:
def fitlers = {
buyFilter(controller:"paypal", action:"buy") {
after = {
new VendorPayment(payment:request.payment, vendor: Vendor.get(params.buyerId)).save()
}
}
}
Ich versuche, dass diese Filter zu testen, funktionieren wie mit dem folgenden Test zu erwarten:
void "test the buyFilter to ensure it creates a VendorPayment when the PayPal plugin controller is called"() {
setup:
// how do I mock the Vendor.get(params.buyerId)
// to return a vendor in order to save a new VendorPayment
when:
withFilters(action:"buy") {
controller.buy()
}
then:
VendorPayment.count() == 1
}
Warum ist es erforderlich, "Get" -Methode zu verspotten? Sie verspotten bereits "Person" im Test und erstellen eine verspottete Personeninstanz. Lasse GORM seine Arbeit erledigen, indem er die erforderliche Person-Instanz in 'show' aufnehme? Hilft? – dmahapatro
Ich habe versucht, ein einfaches Beispiel dafür zu erstellen, dass ich die "Get" -Methode verspotten muss, und vielleicht war dieses Beispiel zu einfach. Ich werde die Frage bearbeiten, um eine kompliziertere Situation hinzuzufügen. –