gpt4 book ai didi

c# - Entity Framework TDD,如何对所需字段进行单元测试模型

转载 作者:行者123 更新时间:2023-11-30 15:06:41 24 4
gpt4 key购买 nike

我开始使用 Entity Framework 4.1 为以下类(class)使用 TDD:

    public class Agent
{
// Primary key
public int ID { get; set; }

[Required]
public string Name { get; set; }

public string Address { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Phone1 { get; set; }
}

我的断言会失败:

    /// <summary>
///A test for Agent Constructor need have name
///</summary>
[TestMethod()]
public void AgentConstructorTest()
{
Agent target = new Agent();
Assert.IsNull(target);
}

当我查看生成的目标对象时,它是用 ID = 0 创建的。那么我如何测试 Name 是必需的?

如果 Name 字段是必需的,我怎样才能创建一个 Agent 对象?什么时候分配真实ID?要测试模型本身,我是否需要创建/模拟一个 DbContext 才能分配 ID?

最佳答案

请记住,您只是在这里处理 POCO 类 - 没有魔法可以允许构建 Agent类失败只是因为您在其属性之一上放置了自定义属性。

Entity Framework 在其验证期间检查自定义属性和数据映射 - 在这种情况下,它将检查 Required属性,并且仅在相应的字符串属性不为 null 时才将实体声明为“有效”,并且它会将 Name 映射到数据库中的不可为 null 的列。

为了反射(reflect)您可以在您的单元测试中编写一个自定义验证例程来执行相同的检查,即确保所有用 Required 修饰的属性。属性确实有一个值,即像这样的东西:

[TestMethod()]
public void AgentWithNoNameIsInvalid()
{
Agent target = new Agent();

Assert.IsFalse(IsValid(target));
}

虽然这确实让人觉得您现在正在测试 EF,而不是您的代码。

由于 ID 是您的主键,因此只有当实体已提交到数据库时才会分配它。因此,是的,对于完整测试,您将必须模拟一个工作单元和一个也为您执行此操作的上下文。虽然有很多陷阱,但 IQueryable<T> 之间存在细微(而不是那么细微)的差异。和 IEnumerable<T>这使得这种方法非常脆弱。

我个人建议您基于具有已知内容的单独测试数据库与 EF 进行集成测试,并根据此测试数据库编写单元测试和预期结果 - 这可能不是真正的 TDD,但我发现这是唯一的方法以确保我正在测试正确的东西。

关于c# - Entity Framework TDD,如何对所需字段进行单元测试模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7466859/

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