我目前正在研究ASP.NET核心控制器的单元测试,我偶然发现了一个有趣的场景.在我的项目中,UpdateUser模型中的StatusId属性声明为int,但其对应的数据库类型为tinyint.在某些条件下,API接受值为StatusId-1.


下面是相关代码的一个片段:

public static class Constant
{
    public static readonly int[] AdminRoleId = new int[] { 1, 2 };
}

public class UpdateUserBase
{
    public int Id { get; set; }
}

public class UpdateUser : UpdateUserBase
{
    public string Name { get; set; }

    public int StatusId { get; set; }
}

// ... Controller code ...

public async Task<IActionResult> UpdateUser(UpdateUser user)
{
    if (!Constant.Constant.AdminRoleId.Contains(UserRoleId))
        user.StatusId = 0; // If it's 0, the status won't be changed

    int result = await _service.UpdateUser(user);.

    return result switch
    {
        > 0 => Ok(),
        _ => BadRequest("Update Failed.")
    };
}

我特别感兴趣的是,当StatusId设置为-1时,我应该如何处理单元测试.考虑到数据类型(C#int和数据库tinyint)的不同,有什么我应该记住的注意事项或最佳实践吗?我是否应该专门测试StatusId等于-1的场景?

您的指导和见解将对我在测试过程中提供极大的帮助.谢谢!

推荐答案

在过渡区中添加测试用例是一个好主意,在过渡区中,值可能导致一边是一种行为,而另一边是不同的行为.

这些值通常被称为boundary values,因为它们填充了两个状态之间的边界.

在本例中,tinyint是一个单字节,包含0255(两者都包含)之间的值,而.NET int(32位带符号整数)的范围要大得多--两边都是.

因此,最好用at least测试值-10,但也用255256测试值.

尽管如此,为什么不把StatuId分的声明改为byte分呢?

Csharp相关问答推荐

PredicateBuilder不是循环工作,而是手动工作

如何使嵌套for-loop更高效?

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

具有单一导航属性的EF核心一对多关系

Appsettings.json未加载.Net 8 Blaazor Web程序集

方法从数据表中只 Select 一个条件?

用C#从Word文档中删除重复的节控件和文本内容控件

.NET并发词典交换值

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

在C#中过滤Excel文件

用于获取字符串的最后12个字符的正则表达式(空格除外)

是否可以从IQueryable T中获取一个IdentyEntry T>

Visual Studio,Docker容器-容器调用:连接被拒绝

Foreach非常慢的C#

如何为控制器PUT操作绑定对象数组

如何处理ASP.NET Core中包含两个构造函数的控制器?

无法对包含字符串的列进行排序.请与实体框架联接

能否将我图表中的星号与X轴上一天中的第二位数字对齐?

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值