2017-08-07 38 views
1

当在Web API使用IDataProtectionProvider,IoC容器配置了AddDataProtectionservices.AddDataProtection();),并允许使用DI的服务检索IDataProtectionProvider这样:在测试项目中使用IDataProtectionProvider?

private readonly IDataProtectionProvider _dataProtectionProvider; 

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

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

问:如何使用DI或以其他方式IDataProtectionProvider在一个测试项目?

+0

那为什么不嘲笑的依赖,并将其注入到依赖类? – Nkosi

+0

因为这是一个集成测试。 – Marcus

+0

回顾[源代码](https://github.com/aspnet/DataProtection/blob/dev/src/Microsoft.AspNetCore.DataProtection/DataProtectionServiceCollectionExtensions.cs),看看你需要模拟/存根/假哪些依赖 – Nkosi

回答

1

这里我它是怎么用起订量框架:

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文章。

希望这会有所帮助。

相关问题