2015-07-11 57 views
0

我正在使用MEF進行依賴項注入,現在我正在編寫一個單元測試,在該測試中我必須注入一個模擬的依賴項,但我已聲明它作爲{ get; protected set; },這使我無法做到這一點。C# - 分配從MEF導入的Mocked依賴關係

的依賴性是使用[Import]屬性,這意味着它不是通過構造或任何類似傳遞導入。

什麼是正確的做法,並以「右」我的意思是它不違反像固體與任何原則,來解決這個不方便?

代碼:

[Import] // MEF is able to inject it even tho it's set accessor is protected 
IMyDependencie MyDependency { get; protected set; } 

回答

1

除非類是密封的,你可以創建一個從它繼承並設置保護屬性的類:

public class TestClass : ClassToBeTested 
{ 
    public TestClass(IMyDependencie mockDependency) 
    { 
     // Set protected property: 
     MyDependency = mockDependency; 
    } 
} 

然後在你的單元測試的設置,用嘲弄的依賴關係創建對象:

// These will be fields in the test class. 
Mock<IMyDependencie> mockDependency = new Mock<IMyDependencie>(); 

TestClass tc = new TestClass(mockDependency.Object); 

另一種方法 - 如果使用if被測試的類是密封的 - 是使用PrivateObject來設置屬性,或者只是簡單的舊反射來做到這一點。

+0

如果你想想看,我的問題可以通過在類的構造函數進口的依賴解決。你會說主要問題是我的班級設計是錯誤的嗎? –

+1

我沒有使用MEF,但我個人更喜歡構造函數注入。 – stuartd