2012-03-21 38 views
2

我正在研究使用依賴注入來處理一些大量的DI框架。我試圖嘗試單元測試目前使用Autofac作爲DI容器的一些類。使用Autofac測試代表工廠

比方說,我有這個類...

public class SaveUserCommand : DBCommandBase<UserImpl> 
{ 
    public delegate SaveUserCommand Factory(UserImpl impl); 

    private UserImpl impl; 
    private IAuditableHelper helper; 

    public SaveUserCommand(UserImpl impl, IAuditableHelper helper) 
    { 
     this.impl = impl; 
     this.helper = helper; 
    } 

    public override UserImpl Execute(object dataTrans) 
    { 
     return this.impl; 
    } 
} 

^命令結構化業務層BTW。

我以這種方式依賴於上面的命令另一命令

public class SaveSpecialUserCommand : DBCommandBase<UserImpl> 
{ 
    public delegate SaveSpecialUserCommand Factory(UserImpl user); 

    private UserImpl user; 
    SaveUserCommand.Factory saveUserCommand; 

    public SaveSpecialUserCommand(UserImpl user, SaveUserCommand.Factory saveUserCommand) 
    { 
     this.user = user; 
     this.saveUserCommand = saveUserCommand; 
    } 

    public override UserImpl Execute(object dataTrans) 
    { 
     this.user.IsSpecial = true; 
     this.saveUserCommand(this.user).Execute(dataTrans); 
     return this.user; 
    } 
} 

使用Autofac,它解決所有的依賴在SaveSpecialUserCommand

我不確定的是我如何進行單元測試或向SaveUserCommand.Factory代表注入模擬代碼。

提示會很好。我仍然想弄明白,但一個大方向將會很棒。

編輯

只要添加一個簡單的測試案例展示我不想使用Autofac在我的單元測試創​​建我的命令。

[Test] 
    public void SomeSimpleTestTest() 
    { 
     var user = new UserImpl(); 

     var command = new SaveSpecialUserCommand(user, /*This is what I need to mock. SaveUserCommand.Factory*/null); 
     var retVal = command.Execute(this._mockTransaction); 

     Assert.IsNotNull(retVal); 
     Assert.IsTrue(retVal.IsSpecial); 
    } 

回答

3

如果通過容器解決SaveSpecialUserCommand,你不能嘲笑廠家代表,因爲這是一塊Autofac自動生成的實例爲您服務。那麼問題是,爲什麼你需要僞造實際的委託?

更新:最初有點誤解。要「僞造」代表,你可以簡單地使用lambda,像這樣:

var user = new UserImpl(); 
var cmd = new SaveUserCommand(...); 

var command = new SaveSpecialUserCommand(user, u => cmd); 
+0

那麼,我沒有計劃讓Autofac爲單元測試創​​建我的命令。我將用我正在嘗試*的測試用例進行編輯。 – DavidAndroidDev 2012-03-22 11:57:59

+0

嗯...除非你建議我在我的單元測試中使用我的DI容器,並將模擬器放置在容器中以用於測試用例? – DavidAndroidDev 2012-03-22 12:03:49

+0

不,我的印象是你*在你的單元測試中使用了一個容器。然後看到我更新的答案。 – 2012-03-22 13:19:03