unit-testing - 如何 reshape S3对象以使其具有可比性?

标签 unit-testing r

我使用 test_that 进行单元测试,我正在尝试比较两个对象。在某些情况下,无论内容如何,​​两个对象似乎永远不会相同 (expect_identical),但如果它们属于同一类,则可以相等 (​​expect_equal) 。我确信这与类的构造方式有关(我使用的是 R.oo)

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

最佳答案

使用 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

关于unit-testing - 如何 reshape S3对象以使其具有可比性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7209885/

相关文章:

javascript - 如何在回调函数javascript中使用断言

ruby-on-rails - 如何在 Rails 测试数据库中创建 mysql 函数?

node.js - 如何模拟从 fs.readFile 返回的错误以进行测试?

Python 的模拟抛出 AttributeError : 'module' object has no attribute 'patch'

unit-testing - 单元测试类的最大长度?

r - 从列中提取模式并在 R 数据框中创建一个新模式

R - 如何将带小数的值更改为不同的形式

r - gls 模型的 `emmeans` 没有 't run inside ` map `

r - 如何使用 R 从网络日志文件中绘制每秒请求数的图表

r - R中64后的累计和(Conditional Cumulative sum)