2017-08-07 114 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文章。

希望這會有所幫助。