2012-07-17 50 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