0

我一直在使用 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 模拟返回一个 IBar 模拟对象时,我收到一个错误,因为 CreateBar() 方法需要一个 Bar 类型的对象而不是 IBar 类型的对象。

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

4

1 回答 1

3

我不认为这个问题是专门针对 Ninject 的,而只是你似乎只是为了测试而声明了一个接口。BarFactory 是否有理由不返回 IBar?

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

于 2012-07-17T00:49:40.760 回答