2015-10-20 49 views
2

我目前正在使用我使用xUnit,AutoMoq,AutoFixture和AutoFixture.XUnit2一起拋出的測試框架。我遇到了使用通用簽名模擬方法的問題。使用具有通用簽名的AutoMoq方法

AutoFixture似乎處理泛型項目就好了。如果我要求一個CustomeObject<Task<List<Task<string>>>>或其他一些荒謬的嵌套泛型類型,它似乎會按預期一直生成它們到最後一個節點。

但是,如果我有一個這樣的接口:

public interface ITestInterface{ 
    T Get<T>(); 
} 

,然後嘗試從我從AutoMoq了模擬調用該方法,它只是返回null。因此,例如:

[Theory] 
[MyAutoDaqaAttribute] 
public async Task ATest(
    Mock<ITestInterface> service 
) { 
    var result = service.Object.Get<string>(); 
} 

在此代碼中,結果將爲空。這對我來說似乎很奇怪。它不應該去自動混合,並嘗試創建一個類型T的值,即一個新的字符串?看起來Autofixture已經表明它可以很好地處理泛型。

或者你總是隻需要手動設置任何在其簽名中具有通用性的模擬方法?

回答

4

默認情況下,模擬對象不會通過AutoFixture。你可以使用AutoConfiguredMoqCustomization

但是,在你的情況下,該方法是通用的。 AutoConfiguredMoqCustomization不適用於泛型方法,您必須手動設置方法。

here提取:

AutoConfiguredMoqCustomization沒有任何配置的通用方法。你可以,但是,輕鬆地設置這些使用ReturnsUsingFixture擴展方法:

converter.Setup(x => x.Convert<double>("10.0")) 
     .ReturnsUsingFixture(fixture); 
+1

對,我應該怎麼使用方式已經AutoConfiguredMoqCustomizations指出。但是感謝您確認AutoConfiguredMoqCustomizations無法配置泛型方法。 所以看起來我無法避免進行某種程度的設置,但我至少可以避免使用ReturnsUsingFixture來設置返回值。我會試試看。謝謝。 – Riplikash

相關問題