2011-08-26 32 views
2

我使用test_that进行单元测试,并试图比较两个对象。在某些情况下,无论内容如何,​​似乎这两个对象都不会相同(expect_identical),但如果它们属于同一类别,则可以相等(expect_equal)。我确信它与这个类是如何构建的(我正在使用R.oo)如何重塑S3对象以使其具有可比性?

那么......是否有可能重塑/变平/重构一个对象(可能到列表中)?原始数据是否被提取,从而使两个对象具有可比性?我意识到这可能是一个不可能完成的任务。我对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

我不熟悉test_that,但问题是可能是由精度引起的(是否有'expect_identical'的宽容类型参数?)或不同的属性(是否有'expect_equal_attributes'?)。 –

+0

你可以发布两个这样的对象的例子吗? – Andrie

+0

Andrie - 我发布了一个例子 – SFun28

回答

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 
+0

哈德利 - 辉煌,不仅仅是为了解决方案,也是为了新的学习。我认为all.equal是递归的,如果我比较两个包含Object的列表,比较会正常工作吗?另外一个对象包含另一个对象的情况? – SFun28

+0

嗯。为了递归,我认为你需要再次检查。向读者展开锻炼;) – hadley

+0

实际上,它似乎递归地工作得很好。我测试了两种情况:1.比较ObjectA/ObjectB,其中A/B包含对象C/D。 2.将对象A/B放在他们自己的列表中并比较这些列表。 – SFun28

相关问题