我使用test_that进行单元测试,我正在尝试比较两个对象。在某些情况下,无论内容如何,似乎两个对象永远不会相同(expect_identical
),但如果它们属于同一类,则可以相等(expect_equal
)。我确定它与类的构造方式有关(我正在使用R.oo)
那么......是否有可能重塑/压平/重构一个对象(可能是一个列表?),以便提取原始数据,从而使两个对象具有可比性?我意识到这可能是一项不可能完成的任务。我对R中的环境知之甚少。
修改的
这是一个例子:
library(R.oo)
library(testthat)
setConstructorS3( "MyClass" , function( )
{
extend( Object() , "MyClass" ,
.param1 = rnorm(10)
)
} )
test1 = MyClass()
test2 = MyClass()
expect_identical(test1, test2) # error: Objects equal but not identical
expect_equal( test1, test2) # no error reported
答案 0 :(得分:3)
str
的一些互动探索引导我:
as.list.Object <- function(x, ...) {
vars <- as.list(attr(x, ".env"), all = TRUE)
vars[substr(names(vars), 1, 3) != "..."]
}
all.equal.Object <- function(target, current, ...) {
all.equal(as.list(target), as.list(current), ...)
}
expect_equal(test1, test2)
# Error: test1 not equal to test2
# Component 1: Mean relative difference: 1.056427