Mar*_*cus 8 c# encryption integration-testing .net-core asp.net-core
IDataProtectionProvider在 Web API 中使用时,IoC 容器使用AddDataProtection( services.AddDataProtection();) 进行配置,并允许使用 DI 来检索IDataProtectionProvider服务中的 a:
private readonly IDataProtectionProvider _dataProtectionProvider;
public CipherService(IDataProtectionProvider dataProtectionProvider)
{
_dataProtectionProvider = dataProtectionProvider;
}
Run Code Online (Sandbox Code Playgroud)
如果我想测试我的CipherService(在我的情况下使用 Xunit),如果不使用 DI,我将无法完成这项工作,所以我的问题是;
问:如何IDataProtectionProvider在测试项目中使用 DI 或其他方式制作?
这是我如何使用 Moq 框架做到的:
Mock<IDataProtector> mockDataProtector = new Mock<IDataProtector>();
mockDataProtector.Setup(sut => sut.Protect(It.IsAny<byte[]>())).Returns(Encoding.UTF8.GetBytes("protectedText"));
mockDataProtector.Setup(sut => sut.Unprotect(It.IsAny<byte[]>())).Returns(Encoding.UTF8.GetBytes("originalText"));
Mock<IDataProtectionProvider> mockDataProtectionProvider = new Mock<IDataProtectionProvider>();
mockDataProtectionProvider.Setup(s => s.CreateProtector(It.IsAny<string>())).Returns(mockDataProtector.Object);
Run Code Online (Sandbox Code Playgroud)
在我需要传入 IDataProtectionProvider 的地方,我使用:
mockDataProtectionProvider.Object
Run Code Online (Sandbox Code Playgroud)
对于需要真正 DataProtectionProvider 的集成测试场景,您可以使用以下MSDN 文档文章。
希望这可以帮助。
EphemeralDataProtectionProvider可用于单元测试场景,因为它为每个实例生成一个随机秘密。
例子:
var dataProtectionProvider = new EphemeralDataProtectionProvider();
var service = new CipherService(dataProtectionProvider);
// test as usual
Run Code Online (Sandbox Code Playgroud)
这是 Microsoft 专门为您的确切用例提供的。
在某些情况下,应用程序需要一次性 IDataProtectionProvider。例如,开发人员可能只是在一次性控制台应用程序中进行试验,或者应用程序本身是瞬态的(它是脚本化的或单元测试项目)。为了支持这些方案,Microsoft.AspNetCore.DataProtection 包包含一个类型 EphemeralDataProtectionProvider。此类型提供 IDataProtectionProvider 的基本实现,其密钥存储库仅保存在内存中,不会写出到任何后备存储。
| 归档时间: |
|
| 查看次数: |
2556 次 |
| 最近记录: |