簡體   English   中英

使用 Laravel assertDatabaseHas 和浮動列進行單元測試

[英]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)中, FLOATDOUBLE數據類型始終存儲為近似值:

FLOAT 和 DOUBLE 類型表示近似數值數據值。 MySQL 對單精度值使用四個字節,對雙精度值使用八個字節。

— 來自: MySQL FLOAT 和 DOUBLE 數據類型參考

另一方面, DECIMAL數據類型允許您存儲長達 65 位的精確十進制值。

DECIMAL 和 NUMERIC 類型存儲精確的數字數據值。 這些類型用於保持精確精度很重要的情況,例如貨幣數據。

— 來自: MySQL DECIMAL 數據類型參考

FLOAT 的問題(參考)

MySQL 文檔涵蓋了FLOATDOUBLE數據類型不准確的問題,並顯示了在數據庫級別使用這些類型具有增量差異的可能解決方案(參考鏈接中的完整示例):

SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROM t1
GROUP BY i
HAVING ABS(a - b) > 0.0001;

重要提示:請記住, FLOATDOUBLE也是平台相關的!

如下所示的SELECT語句可以根據運行時環境返回0-0inf-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM