2016-08-22 65 views
0

我想通過委託工廠傳遞一個存根對象時,測試一個類的行爲。我做了一個測試版本,其中所有類的依賴項(工廠除外)都作爲Mock對象傳遞,它的工作方式應該如此。現在我正在嘗試使用AutoMock來讓容器自動創建模擬。使用mock.Provide()來建立一個委託工廠,在SUT的構造函數中使用

我有問題在使用mock.Provide()在ClassUnderTest的構造函數中傳遞委託工廠的具體值。 (如this comment建議)

類,我測試:

public ClassUnderTest 
{ 
private readonly firstField; 
private readonly Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory; 
private int someCounter = -1; 

public ClassUnderTest(IFirstField firstField, Func<string, ISecondField, IThirdField, IResultField> resultFieldFactory) 
{ 
    this.firstField = firstField; 
    this.resultFieldFactory= resultFieldFactory; 
} 

public methodToTest() 
{ 
    IResultField resultField = resultFieldFactory(someString, secondFieldValue, thirdFieldValue); 
    resultField.AddToList(); 
} 
} 

業務邏輯模塊:

public class BusinessLogicModule: Module 
{ 
//some other things that work 

builder.RegisterType<ClassUnderTest>().As<IClassUnderTest>(); 
builder.RegisterType<SecondField>().As<ISecondField>(); 
builder.RegisterType<ThirdField>().As<IThirdField>(); 
builder.RegisterType<ResultField>().As<IResultField>(); 

} 

測試類:

[TestClass] 
public class TestClass() 
{ 
private IFirstField firstField; 
private Func<string, ISecondField, IThirdField, IResultField> funcToTriggerIResultFieldFactory; 


[TestInitialize] 
public void Setup() 
{ 
    this.firstField= Resolve<IFirstField>(); 
    this.secondField= Resolve<ISecondField>(); 
    this.funcToTriggerIResultFieldFactory = Resolve<Func<string, ISecondField, IThirdField, IResultField>>(); 
} 


[TestMethod] 
public void testMethodWithAutoMock() 
{ 
    using (var automock = AutoMock.GetLoose()) 
    { 
    //trying to setup the SUT to get passed a "concrete" object 
    autoMock.Provide(funcToTriggerIResultFieldFactory(stringValue, secondFieldValue, thirdFieldValue)); 

    var sut = autoMock.Create<IClassUnderTest>; 

    sut.MethodToTest(); 
    //asserts 
    } 
} 

}

我禾如果有任何跡象表明我做錯了,我會很感激。我錯過了什麼?它怎麼能被修復?這是一個簡單的語法修復,或者是我的這個測試方法有問題嗎?

提前感謝您的時間。

+0

通常您使用模擬庫來嘲笑依賴關係,而不是嘗試將模擬添加到DI容器,因爲移動部件太多。你的測試應該對這個類非常具體,所以你只需要設置一些(如果有的話)模擬 –

+0

它不應該是autoMock.Create 而不是IClassUnderTest?什麼是實際問題?您是否收到編譯或執行時錯誤? – suwik

+0

所以我將它改爲「autoMock.Create 」。 當我調用sut.MethodToTest()時,我得到一個System.NullReferenceException。 resultFieldFactory(someString,secondFieldValue,thirdFieldValue) –

回答

0

在你的例子中,當你打電話給autoMock.Provide()時,你沒有傳入你的工廠函數,但你正在調用工廠函數並傳遞結果(IResultField)。爲了解決這個問題,請致電

autoMock.Provide(funcToTriggerIResultFieldFactory); 

Here是註冊與自動嘲諷容器功能的一個完整的例子。

相關問題