0%

基于Abp的扩展模块实现第2例 - 数据字段按需更新(测试)

其他系列博文

背景

在上一篇博文中,我们通过重写DbContext的SaveChanges方式实现了一个基于Abp的按需字段更新机制,在这一篇中博主将对该机制编写单元测试。

目标

  • 创建测试实体,并指定按需更新字段,当调用相关仓储服务的UpdateAsync方法时,若传入值为null,不对其进行更新

思路

创建一个测试用户实体HierarchicalUser,具有HierarchyCodeName两个属性,其中HierarchyCode字段具有较低更新频率,大多数情况下不参与实体更新操作。因此我们可使用上一章中创建的PreventUpdateIfDefault特性对其进行标注,以在集成测试中测试其是否不参与UpdateAsync方法的更新操作。

编码

  1. 创建测试类PartialUpdate_Tests
1
2
3
4
5
6
7
8
9
10
public class PartialUpdate_Tests : EntityFrameworkCoreTestBase
{
// 这里的仓储类是我们在第一篇博文中涉及到的层级用户仓储类
private readonly IHierarchicalUserRepository _userRepository;

public PartialUpdate_Tests()
{
_userRepository = GetRequiredService<IHierarchicalUserRepository>();
}
}
  1. 创建测试方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Fact]
public async Task Should_Prevent_Update_If_HierarchyCode_Of_User_Is_Null()
{
const string fakeHiearchyCode = "1234";
var userId = Guid.NewGuid();

var newUser = new HierarchicalUser(userId, fakeHiearchyCode, "A");
await _userRepository.InsertAsync(newUser, true);

newUser.Name = "B";
newUser.HierarchyCode = null; // 通过赋值null,我们期望HierarchyCode不会参与更新
await _userRepository.UpdateAsync(newUser, true);

var currentUser = await _userRepository.GetAsync(userId);
currentUser.Name.ShouldBe("B"); // 由于Name字段不为按需更新,断言值为新值
currentUser.HierarchyCode.ShouldBe(fakeHiearchyCode); // 由于HierarchyCode字段为按需更新,断言值仍为原值
}
  1. 测试写完了,我们来跑一下:

测试结果

完美通过。

至此数据字段按需更新机制的开发与测试已全部完毕。