在测试项目中使用IDataProtectionProvider?

时间:2017-08-07 11:07:49

标签: c# encryption asp.net-core .net-core integration-testing

在Web API中使用IDataProtectionProvider时,IoC容器配置了AddDataProtectionservices.AddDataProtection();)并允许使用DI来检索服务中的IDataProtectionProvider就这样:

private readonly IDataProtectionProvider _dataProtectionProvider;

public CipherService(IDataProtectionProvider dataProtectionProvider)
{
    _dataProtectionProvider = dataProtectionProvider;
}

如果我想测试我的CipherService(在我的情况下使用Xunit),我将无法在不使用DI的情况下完成这项工作,所以我的问题是;

问:如何在测试项目中使用DI或以其他方式制作IDataProtectionProvider

2 个答案:

答案 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