在Web API中使用IDataProtectionProvider
时,IoC容器配置了AddDataProtection
(services.AddDataProtection();
)并允许使用DI来检索服务中的IDataProtectionProvider
就这样:
private readonly IDataProtectionProvider _dataProtectionProvider;
public CipherService(IDataProtectionProvider dataProtectionProvider)
{
_dataProtectionProvider = dataProtectionProvider;
}
如果我想测试我的CipherService
(在我的情况下使用Xunit),我将无法在不使用DI的情况下完成这项工作,所以我的问题是;
问:如何在测试项目中使用DI或以其他方式制作IDataProtectionProvider
?
答案 0 :(得分:3)
这是我如何使用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);
在我需要传递IDataProtectionProvider的地方,我使用:
mockDataProtectionProvider.Object
对于需要真正DataProtectionProvider的集成测试场景,您可以使用以下MSDN Documentation文章。
希望这有帮助。
答案 1 :(得分:0)
EphemeralDataProtectionProvider可用于单元测试方案,因为它会为每个实例生成一个随机秘密。
示例:
var dataProtectionProvider = new EphemeralDataProtectionProvider();
var service = new CipherService(dataProtectionProvider);
// test as usual