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
如何测试使用Sys.time()的R函数?_R_Unit Testing_Testing_Testthat - Fatal编程技术网

如何测试使用Sys.time()的R函数?

如何测试使用Sys.time()的R函数?,r,unit-testing,testing,testthat,R,Unit Testing,Testing,Testthat,我在一个软件包中有以下R函数,它将Sys.time()输出到输出,以便用户了解算法是如何进行的: func = function(num1, num2){ result = num1 + num2 return(paste0(' ', as.character(Sys.time()), ': with result: ', result)) } 使用此功能的示例如下所示: > func(2, 2) [1] " 2018-03-11 07:24:05: with res

我在一个软件包中有以下R函数,它将
Sys.time()
输出到输出,以便用户了解算法是如何进行的:

func = function(num1, num2){
    result = num1 + num2
    return(paste0(' ', as.character(Sys.time()), ':  with result: ', result))
}
使用此功能的示例如下所示:

> func(2, 2)
[1] " 2018-03-11 07:24:05:  with result: 4"
> 
我需要测试这个函数。通常,我会使用测试包:

问题:如何设置Sys.time()来测试这个函数?是否有其他方法可以测试这一点

如果没有
Sys.time()

library(testthat)
expect_equal(func(2, 2), 4)
expect_equal(func(2, -2), 0)
expect_error(func('a', 'b'))

你可以用这样的东西

func <- function(num1, num2){
    result = num1 + num2
    return(paste0(' ', as.character(Sys.time()), ':  with result: ', result))
}

library(testthat)
使用基数r

expect_equal(as.numeric(regmatches(func(2, 2), regexpr("[0-9]*\\.*[0-9]*$", func(2, 2)))), 4)
expect_equal(as.numeric(regmatches(func(2, -2), regexpr("[0-9]*\\.*[0-9]*$", func(2, -2)))), 0)
expect_equal(as.numeric(regmatches(func(15, 21.3), regexpr("[0-9]*\\.*[0-9]*$",func(15, 21.3)))), 36.3)

或者准确地测试函数的内部,但这取决于函数内部到底是什么

expect_equal(func(2, 2), paste0(' ', as.character(Sys.time()), ': with result: ', 4))
expect_equal(func(2, -2), paste0(' ', as.character(Sys.time()), ': with result: ', 0))
expect_equal(func(15, 21.3), paste0(' ', as.character(Sys.time()), ': with result: ', 36.3))

你可以用这样的东西

func <- function(num1, num2){
    result = num1 + num2
    return(paste0(' ', as.character(Sys.time()), ':  with result: ', result))
}

library(testthat)
使用基数r

expect_equal(as.numeric(regmatches(func(2, 2), regexpr("[0-9]*\\.*[0-9]*$", func(2, 2)))), 4)
expect_equal(as.numeric(regmatches(func(2, -2), regexpr("[0-9]*\\.*[0-9]*$", func(2, -2)))), 0)
expect_equal(as.numeric(regmatches(func(15, 21.3), regexpr("[0-9]*\\.*[0-9]*$",func(15, 21.3)))), 36.3)

或者准确地测试函数的内部,但这取决于函数内部到底是什么

expect_equal(func(2, 2), paste0(' ', as.character(Sys.time()), ': with result: ', 4))
expect_equal(func(2, -2), paste0(' ', as.character(Sys.time()), ': with result: ', 0))
expect_equal(func(15, 21.3), paste0(' ', as.character(Sys.time()), ': with result: ', 36.3))

我认为你应该重写你的函数,让它在列表中返回结果和时间。然后创建一个自定义打印函数来进行格式化。这样,您仍然可以通过编程直接处理结果,而不必使用正则表达式来提取结果。这里有一个例子

func <- function(num1, num2){
  result <- num1 + num2
  time <- Sys.time()
  output <- list(result = result, time = time)
  class(output) <- "MyClass"
  return(output)
}

print.MyClass <- function(obj, ...){
  text <- paste0(' ', as.character(obj$time), ': with result: ', obj$result)
  print.default(text)
}

func我认为你应该重写你的函数,让它在列表中返回结果和时间。然后创建一个自定义打印函数来进行格式化。这样,您仍然可以通过编程直接处理结果,而不必使用正则表达式来提取结果。这里有一个例子

func <- function(num1, num2){
  result <- num1 + num2
  time <- Sys.time()
  output <- list(result = result, time = time)
  class(output) <- "MyClass"
  return(output)
}

print.MyClass <- function(obj, ...){
  text <- paste0(' ', as.character(obj$time), ': with result: ', obj$result)
  print.default(text)
}

func重写函数,使其返回包含结果和时间的类{whateveryouwant}的对象,并生成自定义打印函数类{whateveryouwant}。然后,在测试时,您可以忽略时间方面,直接获得结果。否则你将重新记录结果,这将是一个头痛的问题。@Dason“否则你将重新记录结果,这将是一个头痛的问题。”我不知道为什么。您可以在最后一个
之后使用regex,然后检查是否存在4您刚才回答了自己的问题。你不能也这样做吗
expect_equal(func(2,2),paste0(“”,as.character(Sys.time()),“:with result:”,4))
这样,您还可以测试函数是否返回了时间correctly@EB2127后来,当他们决定要改变他们的测试打破的格式时。将实际数据从格式化方式中分离出来是进行适当测试的良好第一步。此外,如果有人想实际使用输出进行任何操作,而不是在控制台中查看,则以易于使用的格式返回输出会更有意义……重写函数以使其返回类{whateveryouwant}的对象,该类包含结果和时间,并生成自定义打印函数类{whateveryouwant}。然后,在测试时,您可以忽略时间方面,直接获得结果。否则你将重新记录结果,这将是一个头痛的问题。@Dason“否则你将重新记录结果,这将是一个头痛的问题。”我不知道为什么。您可以在最后一个
之后使用regex,然后检查是否存在4您刚才回答了自己的问题。你不能也这样做吗
expect_equal(func(2,2),paste0(“”,as.character(Sys.time()),“:with result:”,4))
这样,您还可以测试函数是否返回了时间correctly@EB2127后来,当他们决定要改变他们的测试打破的格式时。将实际数据从格式化的方式中分离出来是进行适当测试的良好的第一步。此外,如果有人想实际使用输出,而不是在控制台中查看,那么以易于使用的格式返回输出会更有意义……我仍然说,重写函数只是为了返回结果和时间(例如在列表中)将是一种更干净的方法。然后,
expect_equal(func(2,2)$result,4)
可以提供您想要的结果,而不必解析返回字符串中的所有结果。“准确地测试函数的内部结构,但这取决于函数内部结构中的确切内容”这很聪明。我没有想到这一点……我仍然认为重写函数,使其只返回结果和时间(比如在列表中)将是一种更干净的方法。然后,
expect_equal(func(2,2)$result,4)
可以提供您想要的结果,而不必解析返回字符串中的所有结果。“准确地测试函数的内部结构,但这取决于函数内部结构中的确切内容”这很聪明。我没有想到这个。。。