2015-04-23 222 views
0

我试图用NSubstitute嘲笑IComponentContext如下:模拟Autofac.IComponentContext单元测试C#

[TestClass()] 
public class SyncRepositoryFactoryTests 
{ 
    private IComponentContext _container; 
    private SyncRepositoryFactory _factory; 

    [TestInitialize] 
    public void Initialize() 
    { 
     _container = Substitute.For<IComponentContext>(); 
     _factory = new SyncRepositoryFactory(_container); 
    } 

    [TestMethod] 
    public void Get_SyncRepositoryOfITestEntity_Success() 
    { 
     var repository = Substitute.For<IRepository<TestEntity>>(); 
     _container.Resolve<IRepository<TestEntity>>().Returns(repository); 

     var result = _factory.Get<ITestEntity>(); 

     Assert.IsNotNull(result); 
     Assert.IsTrue(result is ISyncRepository<ITestEntity>); 
    } 

    public interface ITestEntity 
    { 
    } 

    public class TestEntity : ITestEntity 
    { 
    } 
} 

,但我得到一个异常:

 ComponentNotRegisteredException: The requested service 
     'Hvb.eMarketAdvisor.Repository.SharePoint.IRepository`1[[Hvb.eMarketAdvisor. 
     Repository.SharePoint.Tests.Units.SyncRepositoryFactoryTests+TestEntity, 
     Hvb.eMarketAdvisor.Repository.SharePoint.Tests.Units, 
    Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' has not been registered. 

    To avoid this exception, either register a component to provide the service, 
    check for service registration using IsRegistered(), or use the ResolveOptional() 
    method to resolve an optional dependency. 

当我尝试创建一个模拟为什么IComponentContext是否尝试解决依赖关系?

+2

嘲讽'IComponentContext'有什么意义?你想在这里测试什么? –

+0

我在这里测试完全隔离工厂Get()方法的逻辑。但是,关于嘲讽IComponentContext用于其他任何目的,这个问题一般。 – Leszek

+0

如何实现Get方法?如果它只是调用解决方案,那么从测试中得不到任何有用的东西。 –

回答

1

因为Resolve<>()是一个扩展方法,所以你只是执行扩展方法,而不是嘲笑它的调用。您需要模拟扩展方法调用的调用。正如上面的评论者所说,如果你嘲笑你的DI容器,你的设计出了问题。