[英]Unit testing with Laravel assertDatabaseHas and a float column
對我的 Laravel 應用程序進行了一些測試,但由於我的數據庫列之一被定義為FLOAT
,我遇到了間歇性故障。 使用assertDatabaseHas()
運行測試時,有時會由於浮點不確定性而失敗。
<?php
namespace Test\Unit;
use App\Foo;
class MyModelTest extends TestCase
{
public function testFooCanBar(): void
{
$stringvalue = "baz";
$floatvalue = 234.281;
$data = [
"name" => $stringvalue,
"data" => $floatvalue,
];
Foo::bar($stringvalue, $floatvalue);
$this->assertDatabaseHas("foos", $data);
}
}
有時結果:
Failed asserting that a row in the table [foos] matches the attributes {
"name": "baz",
"data": 234.281
}.
Found similar results: [
{
"name": "baz",
"data": 234.280999999999999995
}
]
我可以想到幾種方法來解決這個問題(將列更改為INT
並乘以 10^x,或者只是從比較中刪除該列)但我想知道是否有任何方法我錯過了正確檢查這個. 當直接比較值時,我們可以使用 PHPUnit 的assertEqualsWithDelta()
; 有沒有類似的數據庫檢查?
在 MySQL 數據庫(當前為 v8)中, FLOAT
或DOUBLE
數據類型始終存儲為近似值:
FLOAT 和 DOUBLE 類型表示近似數值數據值。 MySQL 對單精度值使用四個字節,對雙精度值使用八個字節。
另一方面, DECIMAL
數據類型允許您存儲長達 65 位的精確十進制值。
DECIMAL 和 NUMERIC 類型存儲精確的數字數據值。 這些類型用於保持精確精度很重要的情況,例如貨幣數據。
— 來自: MySQL DECIMAL 數據類型參考
MySQL 文檔涵蓋了FLOAT
和DOUBLE
數據類型不准確的問題,並顯示了在數據庫級別使用這些類型具有增量差異的可能解決方案(參考鏈接中的完整示例):
SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROM t1
GROUP BY i
HAVING ABS(a - b) > 0.0001;
重要提示:請記住, FLOAT
和DOUBLE
也是平台相關的!
如下所示的SELECT
語句可以根據運行時環境返回0
和-0
或inf
和-inf
:
CREATE TABLE t1(c1 FLOAT(53,0), c2 FLOAT(53,0));
INSERT INTO t1 VALUES('1e+52','-1e+52');
SELECT * FROM t1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.