我正在对我的 ASP.NET Core 应用程序进行集成测试,特别是登录操作,并且遇到了一个问题,即在IPasswordHasher<T>.HashPassword()
我的测试设置和操作执行之间生成了不同的哈希值,我不知道该怎么办。
目前,我的测试首先创建一个用户,使用 哈希化密码HashPassword(null!, password)
,然后将其保存到数据库并返回用户和未哈希化的密码。然后我利用它并创建表单数据以提供给 HttpClient 以将其发布到操作。所有这些都正常工作,唯一的区别是,在测试之前创建用户时,生成的哈希与在操作中检查用户时生成的哈希不同。
我唯一能想到的是,由于IPasswordHasher<T>
是一个范围依赖项,所以我在测试之前创建用户的范围与为操作创建的范围不同,因此每个实例有两个不同的实例并且可能有两个不同的随机数生成器?
目前,我正在解决这个问题,方法是删除所有注册IPasswordHasher<T>
,然后使用我自己的实现重新注册MockPasswordHasher<T>
,该实现只获取密码的哈希码并将其作为字符串返回。虽然这可行,但它让我担心我偏离了正在测试的原始应用程序,因为将要发布的内容会有所不同,因此我的集成测试可能会有缺陷。
internal sealed class MockPasswordHasher<TUser> :
PasswordHasher<TUser>
where TUser : class {
public override string HashPassword(
TUser user,
string password) => password.GetHashCode().ToString();
}
有没有适当的方法来解决这个问题,或者我正在注册的模拟密码哈希器是可行的方法?
在 @Dai 说这可能是设计使然之后,我再次查看了我的实现,并意识到它可能实际上并没有错,只是我的用法
IPasswordHasher<T>
是错误的。我在测试之前创建了用户,对密码进行哈希处理,保存到数据库,然后将用户的凭据传递给操作。这一切都很好,但是在操作的下游处理程序中,我获取了密码并再次对其进行哈希处理,然后将其传递给数据库查找,但始终找不到用户。这就是问题所在。我意识到我没有
VerifyPasswordHash()
在哈希器上使用该方法。因此,我从数据库查询中删除了密码哈希比较,并返回了数据库中的用户密码。然后,我将其作为预期的哈希值与提供的密码一起传递给验证方法,并且它完全按预期工作。我现在可以删除模拟密码哈希器,不再关心实例,并且对我的测试充满信心。
谢谢@Dai!