r语言 - expect_equal由于data.table中的键不同而失败



我写了一个非常简单的单元测试,但由于data.table中的键不同,它一直失败:

out是我的函数的实际结果,expectedOut是我定义的东西:

extectedOut <- data.table(
ID = c("ID-1", "ID-2"), 
Name = c("product-1", "product-2"), 
type = c("N-1", "N-2")
)

我已经使用test_that运行单元测试,它失败了,错误信息:

数据集有不同的键。"目标":ID。'current'没有键。

它们看起来是一样的,但是从结构上看,它们确实有一个键。

> str(out)
Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
$ ID: chr  "ID-1" "ID-2"
$ Name: chr  "name-1" "name-2"
$ type    : chr  "N-1" "N-2"
- attr(*, "sorted")= chr "ID"
- attr(*, ".internal.selfref")=<externalptr> 
> str(extectedOut)
Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
$ ID: chr  "ID-1" "ID-2"
$ Name: chr  "product-1" "product-2"
$ type    : chr  "N-1" "N-2"
- attr(*, ".internal.selfref")=<externalptr> 

如何避免这个错误的发生?

一个选项是在应用expect_equal

之前将数据集的键设置为NULL。
library(data.table)
setkey(out, NULL)

expect_equal是基于all.equal,所以我们也可以使用check.attributes作为FALSE

> out <- copy(extectedOut)
>setkey(out, "ID")
> expect_equal(extectedOut, out)
Error: `extectedOut` not equal to `out`.
Datasets have different keys. 'target': has no key. 'current': [ID].
> expect_equal(extectedOut, out, check.attributes = FALSE)

您可以使用expect_equivalent:

library(data.table)
Out <- data.table(
ID = c("ID-1", "ID-2"), 
Name = c("product-1", "product-2"), 
type = c("N-1", "N-2")
)
expectedOut <- data.table(
ID = c("ID-1", "ID-2"), 
Name = c("product-1", "product-2"), 
type = c("N-1", "N-2")
)
setkey(Out,ID)
testthat::expect_equivalent(Out,expectedOut)
testthat::expect_equal(Out,expectedOut)
#> Error: `expectedOut` not equal to `Out`.
#> Datasets has different keys. 'target': ID. 'current' has no key.

最新更新