我在保存对象(任何对象)进行单元测试时遇到问题。例如,使用给定对象
@Mock([ConvertToDicomService, EventRouterService, User])
@Build([UploadedFile, Manifest])
@TestFor(EventRouterService)
class EventRouterServiceSpec extends ConstraintUnitSpec {
def setup() {
User.metaClass.encodePassword = {-> }
List baseline = []
User archer = new User( username: 'archerSterling', lastName: 'archer', firstName: 'sterling', accountExpired: 'false', accountLocked: 'false', password: 'password', emailAddress: 'a@gmail.com', externalId: 34)
baseline.addAll([archer])
baseline.each {
println "saving: $it"
if (!it.save(flush: true)) {
println "\t... Failed"
}
}
}
在user
控制器上调用save方法
但是用户控制器使用另一个控制器来处理所有操作
import grails.rest.RestfulController
class UserController extends RestfulController<User> {
static responseFormats = ['json', 'xml']
UserController() {
super(User)
}
}
应该在RestfulController.groovy中执行save方法
/**
* Saves a resource
*/
@Transactional
def save() {
def instance = createResource(getParametersToBind())
instance.validate()
if (instance.hasErrors()) {
respond instance.errors, view:'create' // STATUS CODE 422
return
}
instance.save flush:true
}
但是,当我在调试模式中逐步执行时,RestfulController.save()方法永远不会执行,并且我收到此错误消息
groovy.lang.MissingPropertyException: No such property: save for class: com.example.User
Possible solutions: all
承认,我并不熟悉这种类型的控制器交互,需要帮助找出可能的解决方案。任何建议将不胜感激
答案 0 :(得分:0)
按照docs:
中的说明,对您的控制器进行单元测试,您需要模拟您的域类大多数测试都可以通过TestFor注释结合模拟协作者的Mock注释来实现。例如,要测试控制器和关联域,您需要定义以下内容:
@TestFor(BookController)
@Mock([Book, Author, BookService])
所以在你的例子中:
@TestFor(UserController)
@Mock(User)
class UserControllerSpec extends Specification {
}