2014-03-19 2 views
0

컨트롤러에 대한 두 개의 테스트 케이스가 있습니다. InstancePerWebApiRequest를 시뮬레이션하기 위해 각 테스트 케이스가 고유 한 Session 인스턴스를 수신하는지 확인하려고합니다. 현재 구현에는 여러 테스트 케이스에서 단일 ISession 인스턴스로 작동하기 때문에 결함이 있습니다. 그러나 한 테스트 케이스 후에 Scope을 처분하면 Autofac에서 새 세션을 다시 요청했지만 세션이 닫혔다는 말을 듣습니다.테스트 케이스 내부 InstancePerApiRequest에 대한 Session 생성

는 여기에 내가있어 무엇 : 여기

public class AutofacRegistrations 
{ 
    public static void RegisterAndSetResolver() 
    { 
     var containerBuilder = new ContainerBuilder(); 

     containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // Per Design Patterns: Elements of Reusable Object-Oriented Software - an abstract factory is often used as a singleton. 
     containerBuilder.Register(x => new NHibernateConfiguration().Configure().BuildSessionFactory()).SingleInstance(); 
     containerBuilder.RegisterType<NHibernateDaoFactory>().As<IDaoFactory>().SingleInstance(); 
     containerBuilder.RegisterType<StreamusManagerFactory>().As<IManagerFactory>().SingleInstance(); 

     // Everything else wants an instance of Session per API request, so indicate that: 
     containerBuilder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).InstancePerApiRequest(); 
     containerBuilder.Register(x => LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)).InstancePerApiRequest(); 

     ILifetimeScope container = containerBuilder.Build(); 

     var dependencyResolver = new AutofacWebApiDependencyResolver(container); 
     GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver; 
    } 
} 

내가 싱글로 내 공장을 선언하고 내가 API 요청 당 ISession 원하는 것을 나타냅니다. 난 단지 TestFixtureSetup 한 번 내 범위를 인스턴스화하고 있기 때문에

public abstract class StreamusTest 
{ 
    protected ILog Logger; 
    protected IDaoFactory DaoFactory; 
    protected IManagerFactory ManagerFactory; 
    protected Helpers Helpers; 
    protected ISession Session; 

    private IDependencyScope Scope; 

    [TestFixtureSetUp] 
    public void TestFixtureSetUp() 
    { 
     StreamusWebApi.InitializeApplication(); 

     // TODO: I feel like this is incorrect because Session is only generated once. Shouldn't it be SessionPerTestCase? 
     Scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope(); 

     Logger = (ILog)Scope.GetService(typeof(ILog)); 
     DaoFactory = (IDaoFactory)Scope.GetService(typeof(IDaoFactory)); 
     ManagerFactory = (IManagerFactory)Scope.GetService(typeof(IManagerFactory)); 
     Session = (ISession)Scope.GetService(typeof(ISession)); 

     Helpers = new Helpers(Logger, Session, ManagerFactory); 
    } 

    [SetUp] 
    public void SetUp() 
    { 
     // TODO: I think I want to be generating a Scope per SetUp and dispose of it in TearDown. 
     // Scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope(); 
     // Logger = (ILog)Scope.GetService(typeof(ILog)); 
     // Session = (ISession)Scope.GetService(typeof(ISession)); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     // Scope.Dispose(); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     Scope.Dispose(); 
    } 
} 

나는이 기분이 올바르지 않습니다

는 여기에 내가 설정 내 시험 방법은 다음과 같습니다. 각 테스트 케이스 (TearDown에서) 이후에 스코프를 처리하면 두 번째 테스트 케이스가 Session이 닫힌다는 예외를 던집니다.

필자의 현재 구현은 모든 테스트 케이스에서 하나의 세션을 사용한다고 잘못 생각합니다. 누구나 제대로 설정하는 방법에 대한 조언을 해줄 수 있습니까? 여기

은 참조를 위해, 내 실제 테스트 케이스입니다

[TestFixture] 
public class ClientErrorControllerTest : StreamusTest 
{ 
    private ClientErrorController ClientErrorController; 

    [SetUp] 
    public new void TestFixtureSetUp() 
    { 
     ClientErrorController = new ClientErrorController(Logger, Session, ManagerFactory); 
    } 

    [Test] 
    public void CreateError_ShortMessage_ErrorCreated() 
    { 
     var clientErrorDto = new ClientErrorDto 
      { 
       Message = "Hello World", 
       ClientVersion = "0.99", 
       LineNumber = 2 
      }; 

     ClientErrorDto createdErrorDto = ClientErrorController.Create(clientErrorDto); 
     Assert.NotNull(createdErrorDto); 
    } 

    [Test] 
    public void CreateError_LongMessage_MessageTruncatedErrorCreated() 
    { 
     var clientErrorDto = new ClientErrorDto 
      { 
       Message = 
        "Hello World This is a Really Long Message Which is going to be over 255 characters in length when finished which will cause the end result message to be truncated with three periods as to not overflow the database. Can I confirm that this is happening? Thanks", 
       ClientVersion = "0.99", 
       LineNumber = 2 
      }; 

     ClientErrorDto createdErrorDto = ClientErrorController.Create(clientErrorDto); 

     Assert.NotNull(createdErrorDto); 
     Assert.That(createdErrorDto.Message.Length == 255); 
    } 
} 

답변

1

이 다소 similar/related to your other question 당 요청 범위를 얻기에 관하여 나타납니다. The answer here is the same as before - HttpRequestMessage을 사용하면 평생 범위을 (를) 관리 할 수 ​​있습니다. 이는 평생 범위에서 컨트롤러를 확인하는 것을 의미하며, 차례로 InstancePerApiRequest으로 등록 된 모든 종속성을 해결합니다.

또한 앞의 대답에서 언급했듯이 전 전역 정적 변수 (전역 종속성 해결 프로그램)를 설정하지 않아도됩니다. 정적 환경을 설정하면 테스트 환경을 엉망으로 만들고 이상한/어려운 문제를 재현하거나 간헐적으로 실패 할 수 있습니다.

관련 문제