簡體   English   中英

使用 mocha/chai 進行測試時比較兩個日期

[英]Compare two dates when testing with mocha/chai

我正在使用"chai": "^4.2.0""mocha": "^6.1.4", .

當使用assert.equal()比較兩個日期時,即使這兩個日期似乎相同,我也會得到錯誤:

在此處輸入圖片說明

這是我的示例測試:

  it('check if dates are correctly added', async () => {
let dataArr = [{'rating_date':'6/6/2019','impact_on_price':'Low'}]   
let priceServ = new PriceService()

// clear all records
priceServ.clearPriceTable()

// add 1 record
const res = await priceServ.createOrUpdatePrice(dataArr)

// get "all" records from the table that have a certain action attribute
const tableValues = await priceServ.getPricesByField('rating_date')
assert.equal(tableValues[0].rating_date, new Date(dataArr[0].rating_date));

});

任何建議我做錯了什么?

我感謝您的回復!

Chai 的assert.deepEqual正確比較了Date對象。

const { assert } = require('chai')

const a = new Date(0)
const b = new Date(0)
const c = new Date(1)

assert.deepEqual(a, b) // ok
assert.deepEqual(b, c) // throws

當然,傳遞給deepEqual兩個參數都是Date對象,而不是stringnumber是必要的。

正如我在評論中提到的, assert.equal檢查嚴格相等。 嘗試比較時間戳:

assert.equal(tableValues[0].rating_date.getTime(), new Date(dataArr[0].rating_date).getTime());

請注意,當日期不同時,錯誤消息可能會非常難看。 圖書館

另一種方法是導入expect而不是assert 然后您可以使用 Chai 的深度相等檢查.eql() ,例如:

  expect.eql(tableValues[0].rating_date, new Date(dataArr[0].rating_date));

我更喜歡這種方法,因為失敗消息被記錄為簡單的日期,從而更容易修復失敗的測試。

有一個名為 chai-datetime 的插件。 https://www.chaijs.com/plugins/chai-datetime/

要求

const chai = require("chai");
const assert = chai.assert;
chai.use(require("chai"));

進口

import chai, { assert } from "chai";
import chaiDateTime from "chai-datetime";
chai.use(chaiDateTime);
// old
assert.equal(tableValues[0].rating_date, new Date(dataArr[0].rating_date));

// with plugin
// compares only the date portion
assert.equalDate(tableValues[0].rating_date, new Date(dataArr[0].rating_date));
// compares timestamps
assert.equalTime(tableValues[0].rating_date, new Date(dataArr[0].rating_date));

// Also!
let date1 = new Date();
let date2 = date1.toISOString();
let date3 = date1.valueOf();
let date4 = date1.getTime();

assert.equalTime(date1, date1);
assert.equalTime(date1, date2);
assert.equalTime(date1, date3);
assert.equalTime(date1, date4);
assert.equalTime(date2, date1);
assert.equalTime(date2, date2);
assert.equalTime(date2, date3);
assert.equalTime(date2, date4);
// and so on.
// There are also other assertions added, such as before-, closeTo-, afterOrEqual-, within-, etc.

let date5 = new Date();
assert.afterOrEqual(date5, date1);
assert.closeTo(date5, date2, 5) // delta = within 5 seconds

注意:我發現在測試時比較時間戳更有用。 這樣測試更容易。 我正在開發一個連接到 MSSQL 服務器的 Java api,帶有一個 JS 前端。 在我的本地版本中,保存生日和培訓日期效果很好。 當我的主管連接到實時開發服務器時,每次她保存表單時,每個日期都會向后移動一天。 那是因為它正在考慮午夜的時間和時區混淆之類的。 因此,JS 會在午夜將這一天轉換為日期時間,然后將其發送出去,而 Java 會在另一個時區(前一天)的午夜發回日期時間。 我最終將所有內容都設置為中午,因為時差不到 12 小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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