2012-07-17 87 views
0

我一直在使用Ninject進行依賴注入和控制反轉,並且我一直使用Moq進行測試非常成功;但是,最近我進入了一個需要開始使用Ninject的工廠擴展的位置。Moin的Ninject擴展工廠

我的線沿線的代碼:

interface IBarFactory 
{ 
    Bar CreateBar(); 
} 

class Bar : IBar 
{ 
    ... 
} 

class BarModule 
{ 
    public override void Load() 
    { 
     Bind<IBarFactory>().ToFactory(); 
    } 
} 

class Tests 
{ 
    [Fact] 
    public void TestMethod() 
    { 
     var bar = new Mock<IBar>(); 
     bar.Setup(b => b.DoSomething()) 
      .Verifiable(); 

     var barFactory = new Mock<IBarFactory>(); 
     cryptoKeyFactoryMock.Setup(f => f.CreateBar()) 
      .Returns(bar.Object) 
      .Verifiable(); 

     var someOtherClass = new SomeOtherClass(barFactory.Object); 
    } 
} 

當試圖迫使IBarFactory模擬返回的IBAR嘲笑的對象,我得到一個錯誤,由於事實CreateBar()方法需要一個酒吧鍵入對象而不是IBar類型的對象。

有沒有人使用Moq與Ninject Factory更成功?

回答

3

我不認爲這個問題是Ninject的具體問題,但只是你似乎只是爲了測試而聲明一個接口。 BarFactory不應該返回IBar嗎?

Moq可以模擬類,而不僅僅是接口。您可以設置模擬<Bar>實例,以供模擬的BarFactory調用返回。需要注意的是,任何想要在Mocked Bar實例上聲明的方法/屬性都必須聲明爲虛擬。因此,在您的示例中,如果您將DoSomething()聲明爲虛擬,那麼您可以使用聲明而不是IBar來設置Bar類型的模擬。

+0

ninject工廠擴展自動生成一個工廠類超出該界面(因此綁定().ToFactory())。該界面不僅僅用於測試。 – 2012-07-17 01:06:17

+0

@ChrisCovert他的意思是IBar。要麼改變工廠返回IBar或模擬酒吧。 – 2012-07-17 06:57:44

+0

我想我試圖找到一個解決方案,並不需要我標記虛擬的東西。由於Ninject.Factory的工作原理,我認爲我不能讓工廠返回IBar,這正是我之前想說的。 – 2012-07-17 12:48:39