c# - 如何在单元测试中设置自动增量 ID

标签 c# unit-testing domain-driven-design

我面临以下情况:

我的实体的 ID 是自动递增的,所以我将所有实体的 setter 设置为 private,但是当我想对我的域类进行单元测试时,我发现自己需要获取并设置ID。

如何设置 ID?

public WorkingTime(string name, short numberOfHours, short numberOfShortDays, int workingGroupId)
{
    Name = name;
    NumberOfHours = numberOfHours;
    NumberOfShortDays = numberOfShortDays;
    WorkingGroupId = workingGroupId;
    ActivatedWorkingTimes = new List<WorkingTimeActivation>();
}

private ICollection<WorkingTimeActivation> _activatedWorkingTimes;

public int Id { get; private set; }
public string Name { get; set; }
public short NumberOfHours { get; set; }
public short NumberOfShortDays { get; set; }
public int WorkingGroupId { get; set; }
public virtual WorkingGroup WorkingGroup { get; set; }
public virtual ICollection<WorkingTimeActivation> ActivatedWorkingTimes { get => _activatedWorkingTimes; set => _activatedWorkingTimes = value; }

测试示例:

var workingGroup = new WorkingGroup("WG", 3, Week.Sunday, 2);
workingGroup.AssignedWorkingTimes.Add(new WorkingTime("Winter", 8, 1, 1));
workingGroup.AssignedWorkingTimes.Add(new WorkingTime("Summer", 6, 0, 1));

现在我想设置workingGroupId

Should I use public setter instead ?

最佳答案

Should I use public setter instead ?

可能不会,不。

有两种选择可供考虑。

一个是,如果标识符真的是私有(private)数据,那么测试应该不需要直接与它交互。我们将测试的范围限制在模型中可观察的副作用,以便我们以后可以自由更改私有(private)实现细节。

另一个是测试试图引起您的注意,您可能会使用不同的策略来生成标识符,并且不同的策略可能适用于不同的上下文 - - 一种用于生产代码的策略,另一种用于测试工具。

基本模式隔离了策略,并提供了控制应用哪种策略所需的功能。在测试中,我们使用 test double 来实现策略合约。 ,这允许 测试 保持对任意副作用的确定性控制。

关于c# - 如何在单元测试中设置自动增量 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372335/

相关文章:

visual-studio - 如何让 Visual Studio 将单元测试放置在我想要的位置?

c# - 如何使用 TDD(首先测试)来实现密码哈希?

.net - 实现领域驱动设计的功能方式

c# - 质疑使用具有 Restful 服务的 DTO 并从更新中提取行为

c# - 如何获取通过 Polly 重试策略执行的委托(delegate)中的重试计数?

java - JUnit 4.xx (Java) 尝试获取行覆盖范围时出现 Mockito 问题

c# - MSMQ 连接缓存安全漏洞?

domain-driven-design - CQRS + 没有 DDD 的事件溯源

c# - 使用 linq/lambda 选择最早的日期

javascript - 使用 JavaScript 将文本从一个文本框发送到另一个文本框