Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Grails测试域模型-模拟_Unit Testing_Grails_Testing - Fatal编程技术网

Unit testing Grails测试域模型-模拟

Unit testing Grails测试域模型-模拟,unit-testing,grails,testing,Unit Testing,Grails,Testing,我试图在一个域对象中测试一些方法,代码似乎是基于日志执行的,但是断言失败了 正在测试的代码extendDates正在运行,我现在只添加单元测试。 我假设我在模拟中做错了什么。根据日志输出,断言应该通过 class EventDate{ Date startDate Date endDate belongsTo = [Appointments owner] static constraints = { endDate(nullable:true, blank:fa

我试图在一个域对象中测试一些方法,代码似乎是基于日志执行的,但是断言失败了

正在测试的代码extendDates正在运行,我现在只添加单元测试。 我假设我在模拟中做错了什么。根据日志输出,断言应该通过

class EventDate{
   Date startDate
   Date endDate
   belongsTo = [Appointments owner]
   static constraints = {
     endDate(nullable:true, blank:false)
     startDate(nullable:false, blank:false)
   }
}

class Appointments {
     hasMany = [ eventDates: EventDate]
     belongsTo = [ customer: Customer ] 

     def extendDates(start,end){
         //some logic on eventDates...
         EventDate(startDate:start,endDate:end, owner:this).save(flush:true,failOnError:true);
     }
}

@TestFor(Appointments)
@Mock([EventDate])
class AppointmentsTests {

    void testDateExtend(){
        assertTrue domain != null
        assertTrue domain instanceof Appointments

        //Log indicates the correct execution and creation of event
        domain.extendDates(new Date(),null)
        //following returns NullPointerException
        assertTrue domain.eventDates.size() == 1
    }
}
是的,您将在断言条件中获得NullPointerException。原因是,您正在extendDates方法中创建EventDate实例,但实际上并没有将其添加到约会域中的eventDates列表中

因此,您必须修改该方法,例如:

// Initialize with empty array to avoid NPE
List<EventDate> eventDates = []

static hasMany = [ eventDates: EventDate]

def extendDates(start, end) {
     EventDate instance = EventDate(start, end).save()

     // And add it to the list of events
     this.addToEventDates(instance)
     this.save(flush: true)
 }
现在,您的测试用例应该满足您的断言条件

另外,看起来您最后没有添加nullable约束,但在创建EventDate实例时传递null值,可能未包含在示例代码中。是的,您将在断言条件中获得NullPointerException。原因是,您正在extendDates方法中创建EventDate实例,但实际上并没有将其添加到约会域中的eventDates列表中

因此,您必须修改该方法,例如:

// Initialize with empty array to avoid NPE
List<EventDate> eventDates = []

static hasMany = [ eventDates: EventDate]

def extendDates(start, end) {
     EventDate instance = EventDate(start, end).save()

     // And add it to the list of events
     this.addToEventDates(instance)
     this.save(flush: true)
 }
现在,您的测试用例应该满足您的断言条件


另外,看起来您最后并没有添加nullable约束,但在创建EventDate实例时传递了null值。在您测试的示例中,示例代码中可能没有包含此约束

if (create_new)
变量create_new从未设置,因此将使用groovy真理逻辑测试false,因此从未执行if语句

if语句从不向约会的eventDates属性添加任何内容,这也意味着断言将失败


我认为您的示例是不完整的,因此在您扩展它之前无法帮助您。

在您的示例中,您测试了

if (create_new)
变量create_new从未设置,因此将使用groovy真理逻辑测试false,因此从未执行if语句

if语句从不向约会的eventDates属性添加任何内容,这也意味着断言将失败


我认为您的示例是不完整的,因此在您扩展它之前无法帮助您。

对,我为这些错误道歉,您应该更仔细地复制代码。正如我在描述中所添加的,extendDates方法已经过手动测试,并且按照预期工作。此外,在实际代码中,不需要显式地拒绝列表,只需要关联就可以了。不管怎样,这都是正确的。这个问题没有出现在我的代码中。我猜测试达到了目的^ ^对,我为这些错误道歉,应该更仔细地复制代码。正如我在描述中所添加的,extendDates方法已经过手动测试,并且按照预期工作。此外,在实际代码中,不需要显式地拒绝列表,只需要关联就可以了。不管怎样,这都是正确的。这个问题没有出现在我的代码中。我猜这次测试达到了目的^_^