gpt4 book ai didi

f# - 具有生成字段的记录类型的相等性测试

转载 作者:行者123 更新时间:2023-12-04 20:10:27 39 4
gpt4 key购买 nike

如果记录类型包含生成的字段,例如自动生成的 ID 和时间戳,例如:

type UserCreated = {
Id: Guid
Name: string
CreationTime: Instant
}

为此编写单元测试的最佳方法是什么?不可能简单地断言记录等于任何特定值,因为无法提前知道 Id 和 CreationTime 值将是什么。

可能的解决方案:

  • 对每个字段进行单独断言
  • 将一个函数传递给处理 ID 和日期生成的用户创建函数。然后单元测试可以注入(inject)一个 stub 函数,该函数返回预先确定的值。或者确实让调用者直接传入 id 和时间戳。
  • 使用某种镜头库
  • 从不自动生成任何内容,由客户提前决定所有字段
  • 使用自定义相等比较器(这听起来根本不是个好主意)
  • 还有别的吗?

最好的方法是什么?

最佳答案

我的方法确实是将一个函数传递给处理 ID 和日期生成的用户创建函数。如果您必须传入的参数太多,那么这可能是您需要重构设计的线索。

这里是领域层,例如:

// =================
// Domain
// =================
open System

type UserCreated = {
Id: Guid
Name: string
CreationTime: DateTime
}

// the generation functions are passed in
let createCompleteRecord generateGuid generateTime name =
{
Id = generateGuid()
Name = name // add validation?
CreationTime = generateTime()
}

在应用程序代码中,您将使用部分应用程序来烘焙生成器并创建一个有用的函数 createRecord

// =================
// Application code
// =================
let autoGenerateGuid() = Guid.NewGuid()
let autoGenerateTime() = DateTime.UtcNow

// use partial application to get a useful version
let createRecord = createCompleteRecord autoGenerateGuid autoGenerateTime

let recForApp = createRecord "myname"

在测试代码中,您将使用部分应用程序来烘焙其他生成器并创建不同的函数 createRecordForTesting

// =================
// Test code
// =================

let explicitGenerateGuid() = Guid.Empty
let explicitGenerateTime() = DateTime.MinValue

// use partial application to get a useful version
let createRecordForTesting = createCompleteRecord explicitGenerateGuid explicitGenerateTime

let recForTest = createRecordForTesting "myname"

Assert.AreEqual(Guid.Empty,recForTest.Id)
Assert.AreEqual("myname",recForTest.Name)
Assert.AreEqual(DateTime.MinValue,recForTest.CreationTime)

并且由于“生成的”字段现在具有硬编码值,您还可以测试整个记录相等逻辑:

let recForTest1 = createRecordForTesting "myname"
let recForTest2 = createRecordForTesting "myname"
Assert.AreEqual(recForTest1,recForTest2)

关于f# - 具有生成字段的记录类型的相等性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27889652/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com