2017-05-23 45 views
0

使用C#/ Autofac /起订量:我有这个类:如何嘲笑Autofaq接口,起订量

public class MyService 
{ 
    private readonly IlifetimeScope _scope; 

    public MyService(ILifetimeScope scope) 
    { 
     _scope = scope; 
    } 

    public void DoWork() 
    { 
     var dbContext = _scope.Resolve<IDataContext>(); 
    } 
} 

此工程在运行时。但是,我不能单元测试它,因为我不能模拟Resolve()方法。这是一种扩展方法。

能够嘲笑它的最佳方式是什么?显而易见的事情是将IDataContext注入到构造函数中而不是ILifetimeScope中,但出于各种原因我不能。

那么,它会工作,而不是注入一个Func?

public class MyService 
{ 
    private readonly Func<IDataContext> _dbContext; 

    public MyService(Func<IDataContext> dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public void DoWork() 
    { 
     var ctxt = _dbContext(); 
     // do stuff 
    } 
} 

如在:我可以嘲笑它,但Autofac会弄清楚如何将正确的参数注入ctor?还是有更好/更简单的方法来做到这一点?

+1

我很好奇使用构造函数注入的“各种原因你不能使用”,这导致你使用服务定位器反模式。你已经承认这是一种可能性,但为什么不通过这些问题来解决问题,而不是试图找到解决方法(可能甚至不需要引用Autofac)?我觉得有必要考虑一下如果删除对DI容器的引用会发生什么情况 - 如果在组成根目录之外的任何内容会中断,如果你这样做,你可能会紧密耦合到容器。 – NightOwl888

+0

不要嘲笑范围,只是把模拟的东西放在里面。 –

回答

0

你有没有考虑简单地嘲笑范围?

public class Test 
{ 
    private readonly Mock<ILifetimeScope> _scopeMock; 
    private readonly Mock<IDataContext> _contextMock; 

    public Test() 
    { 
     _contextMock = new Mock<IDataContext>(); 
     _scopeMock = new Mock<ILifetimeScope>(); 
     _scopeMock.Setup(s => s.Resolve<IDataContext>()).Returns(_contextMock.Object); 
    } 
} 
+2

正如我在我的问题中所述,Resolve()方法不能被嘲笑,因为它是一个扩展方法。 –

0

对于其他人在看这个; Func<T>技巧为我工作。