gpt4 book ai didi

c# - 测试 CRUD 类。

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:09 24 4
gpt4 key购买 nike

我有一些问题。我在我的项目中编写了一些单元测试,但我不知道如何测试我的 CRUD 方法。也许它们不可测试;/

这是我的方法之一:

    public static void IncrementInvalidLoginColumn(string login)
{
User user;

using (DTContext context = new DTContext())
{
try
{
user = context.Users.Where(u => u.Login.CompareTo(login) == 0).FirstOrDefault();

if (user.InvalidLogins < 3)
{
user.InvalidLogins = user.InvalidLogins + 1;
}

context.SaveChanges();
}
catch
{

}
}
}

也许有人会知道我该怎么做。

最佳答案

这取决于您所说的“单元”测试是什么意思。如果您不希望您的测试命中数据库,那么您的方法是不可测试的(或者至少在没有一些重构的情况下是不可测试的)。

如果访问数据库是可以接受的(实际上是 集成 测试),那么您绝对可以测试您的方法。

以下是一些步骤:
1. 整理初始数据。您使用 DTContext 的实例直接在测试中将系统置于预定义的状态(基本上你在数据库中写一些用户记录)

  • 你运行你想测试的方法(实际上它使用了它自己的 DTContext 实例)
  • 您使用 DTContext再次直接从数据库中读取用户信息并断言 InvalidLogins属性(property)增加了。
  • 您需要确保删除手动输入的所有数据。


  • 这是 DI 的要点:
    public class Example { 
    private IDatabaseGateway myDatabase;

    public Example(IDatabaseGateway myDb) {
    myDatabase = myDb;
    }

    public void DoStuff() {
    ...
    myDatabase.GetData();
    ...
    }
    }

    您通过构造函数为您的业务类提供数据库的抽象,即您 注入(inject) 您在需要它们的类中的依赖项。

    一旦你有了这个,在生产代码中,你将在构造函数中传递一个 IDatabaseGateway 的具体实例,该实例将转到实际的数据库。

    在单元测试的情况下,你通过了 模拟 同一个接口(interface)的实例。模拟是一个特殊的对象,您可以设置/配置它以返回您想要的。存在各种用于模拟的库(一个简单的库是 Moq)。

    但是,在不过多修改代码的情况下,最好坚持使用针对数据库的集成测试。它会给你一个简单而有效的测试。
    特别是因为在 EF 中模拟 DbContext 存在一些缺陷(例如,当您在生产中使用它们时,某些查询可能无法正常工作,使用模拟在 EF 中测试更新有点棘手)。

    关于c# - 测试 CRUD 类。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25383780/

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