2015-04-23 224 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容器,你的設計出了問題。