Moq的Ninject扩展工厂

时间:2012-07-17 00:37:17

标签: c# ninject

我一直在使用Ninject进行依赖注入和控制反转,而且我一直非常成功地使用Moq进行测试;但是,我最近进入了一个需要开始使用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 mock返回一个IBar模拟对象时,由于CreateBar()方法需要Bar类型对象而不是IBar类型对象,我得到一个错误。

有没有人使用Moq和Ninject Factory取得更大的成功?

1 个答案:

答案 0 :(得分:3)

我认为这个问题并不是Ninject,而是因为您似乎只是在宣称一个接口用于测试。 BarFactory有没有理由不归还IBar?

Moq可以模拟类,而不仅仅是接口。你可以设置一个Mock&lt; Bar&gt;模拟BarFactory调用返回的实例。需要注意的是,您要在Mocked Bar实例上声明的任何方法/属性都必须声明为虚拟。因此,在您的示例中,如果您将DoSomething()声明为虚拟,那么您可以使用声明而不是IBar设置Bar类型的模拟。