object no found error in testthat tests

2019-03-05 11:36发布

Here is the code:

setGeneric("ifLet",
        function(sym, x, body1, body2, ...) {
            standardGeneric("ifLet")
        })

#' @name ifLet
#' @export 
setMethod("ifLet",
        signature(sym = "name", x = "ANY", body1 = "ANY", body2 = "ANY"),
        function(sym, x, body1, body2 = {}) {
            e = new.env()
            sym_str = deparse(substitute(sym))
            ifLet(sym_str, x, body1, body2)
        })

#' @rdname ifLet
#' @export 
setMethod("ifLet",
        signature(sym = "character", x = "ANY", body1 = "ANY", body2 = "ANY"),
        function(sym, x, body1, body2 = {}) {
            stopifnot(length(sym) == 1)
            e = new.env()
            e[[sym]] = x
            if(e[[sym]]) {
                eval(substitute(body1), e)
            } else {
                eval(substitute(body2), e)
            }
        })

# test
ifLet("myvar", 3 > 2, {
            as.integer(myvar) * 3
        }, {
            as.integer(myvar) + 1
        }) == 3

The test passes in a reple but fails in a testthat context, why?

Here is the error msg:

1. Error: ifLet ----------------------------------------------------------------
object 'myvar' not found
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls)
2: eval(code, new_test_environment)
3: eval(expr, envir, enclos)
4: ifLet("myvar", 3 > 2, {
   as.integer(myvar) * 3
   }, {
   as.integer(myvar) + 1
   }) at test.bedinfo.R:60
5: ifLet("myvar", 3 > 2, {
   as.integer(myvar) * 3
   }, {
   as.integer(myvar) + 1
   }) at /Users/kaiyin/EclipseWorkspace/CollapsABEL/R/0_ifLen.R:58
6: .local(sym, x, body1, body2, ...)
7: eval(substitute(body1), e) at /Users/kaiyin/EclipseWorkspace/CollapsABEL/R/0_ifLen.R:80
8: eval(expr, envir, enclos)
9: .handleSimpleError(function (e) 
   {
   e$calls <- head(sys.calls()[-seq_len(frame + 7)], -2)
   signalCondition(e)
   }, "object 'myvar' not found", quote(eval(expr, envir, enclos))) at test.bedinfo.R:61

标签: r testthat
0条回答
登录 后发表回答