我写了一个非常简单的单元测试,但由于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
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.