我一直在使用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取得更大的成功?
答案 0 :(得分:3)
我认为这个问题并不是Ninject,而是因为您似乎只是在宣称一个接口用于测试。 BarFactory有没有理由不归还IBar?
Moq可以模拟类,而不仅仅是接口。你可以设置一个Mock&lt; Bar&gt;模拟BarFactory调用返回的实例。需要注意的是,您要在Mocked Bar实例上声明的任何方法/属性都必须声明为虚拟。因此,在您的示例中,如果您将DoSomething()声明为虚拟,那么您可以使用声明而不是IBar设置Bar类型的模拟。