2013-10-10 5 views
1

У меня есть ServiceStack AppHostHttpListenerBase сконфигурирован в моих тестах с целью выполнения тестов, как так:ServiceStack AppHostHttpListenerBase не в состоянии разрешить службу зависимостям

public class UserProfileBehaviours : BaseTest<UserProfileService> 
{ 
    [Test] 
    public void Can_access_secure_service() 
    { 
     var client = GetClientWithUserPassword(); 

     var result = ((IRestClient)client).Get(new Dto.View.Requests.UserProfileRequest 
      { 
       Slug = "user" 
      }); 

     result.Result.UserAccount.Username.Should().Be("user"); 
    } 
} 

Моего BaseTest выглядит:

[TestFixture] 
public class BaseTest<T> 
{ 
    protected TestAppHostHttpListenerBase<T> AppHost; 
    private const string ListeningOn = "http://localhost:82/"; 
    private const string UserName = "user"; 
    private const string Password = "[email protected]"; 
    protected readonly Container Container; 

    public BaseTest() 
    { 
     Container = new Funq.Container 
     { 
      Adapter = new WindsorContainerAdapter() 
     }; 
    } 

    [TestFixtureSetUp] 
    public void OnTestFixtureSetUp() 
    { 
     AppHost = new TestAppHostHttpListenerBase<T>(); 

     AppHost.Init(); 

     AppHost.Start(ListeningOn); 
    } 

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

    protected IServiceClient GetClient() 
    { 
     return new JsonServiceClient(ListeningOn); 
    } 

    protected IServiceClient GetClientWithUserPassword() 
    { 
     return new JsonServiceClient(ListeningOn) 
     { 
      UserName = UserName, 
      Password = Password 
     }; 
    } 
} 

И тогда мои WindsorContainerAdapter:

И, наконец, мой TestAppHostH ttpListener

public class TestAppHostHttpListenerBase<T> : AppHostHttpListenerBase 
{ 
    public const string WebHostUrl = "http://localhost:82/"; 
    private InMemoryAuthRepository _userRep; 
    private const string UserName = "user"; 
    private const string Password = "[email protected]"; 
    public const string LoginUrl = "specialLoginPage.html"; 

    public TestAppHostHttpListenerBase() 
     : base("Validation Tests", typeof(T).Assembly) 
    { 
    } 

    public override void Configure(Container container) 
    { 

     var appSettings = new AppSettings(); 

     SetConfig(new EndpointHostConfig { WebHostUrl = WebHostUrl }); 

     Plugins.Add(new AuthFeature(
         () => 
         new AuthUserSession(), 
         new IAuthProvider[] 
          { 
           new BasicAuthProvider(), 
           new CredentialsAuthProvider(), 
           new TwitterAuthProvider(appSettings), 
           new FacebookAuthProvider(appSettings) 
          }, "~/" + LoginUrl)); 

     container.Register<ICacheClient>(new MemoryCacheClient()); 
     _userRep = new InMemoryAuthRepository(); 
     container.Register<IUserAuthRepository>(_userRep); 
     CreateUser(1, UserName, null, Password, new List<string> { "TheRole" }, new List<string> { "ThePermission" }); 
    } 

    private void CreateUser(int id, string username, string email, string password, List<string> roles = null, List<string> permissions = null) 
    { 
     string hash; 
     string salt; 
     new SaltedHash().GetHashAndSaltString(password, out hash, out salt); 

     if (_userRep.GetUserAuthByUserName(username) == null) 
     { 
      _userRep.CreateUserAuth(new UserAuth 
      { 
       Id = id, 
       DisplayName = "DisplayName", 
       Email = email ?? "[email protected]{0}.com".Fmt(id), 
       UserName = username, 
       FirstName = "FirstName", 
       LastName = "LastName", 
       PasswordHash = hash, 
       Salt = salt, 
       Roles = roles, 
       Permissions = permissions 
      }, password); 
     } 
    } 
} 

Когда контейнер выполнен я могу видеть, что есть компонент для UserAccountRepository однако - если этот компонент является зависимостях для UserProfileService клиент получает исключение, говоря, что autowired зависимостях не может быть решена. Что я не понимаю, где AppHostHttpListenerBase получить контейнер?

Мой адаптер Windsor никогда не запрашивается Resolve компонентом для репозитория.

Как я могу предоставить контейнер AppHostHttpListenerBase, чтобы он мог разрешить эти зависимости? Или мне нужно настроить его другим способом?

ответ

1

Попробуйте установить адаптер контейнера в верхней части метода TestAppHostHttpListenerBase.Configure, вместо того, чтобы в вашем BaseTest класса:

public override void Configure(Container container) 
{ 
    container.Adapter = new WindsorContainerAdapter(); 
    ... 
} 

Container данный объект методу TestAppHostHttpListenerBase.Configure создается в базовом конструкторе TestAppHostHttpListenerBase; вы не имеете прямого контроля над его созданием. Это экземпляр контейнера вам нужно настроить с адаптерами и т.д.

Если вы должны использовать один и тот же контейнер IoC в ваших UserProfileBehaviours или других модульных тестах классов, я думаю, что вы можете ссылаться на него через статический EndpointHost.Container собственности, исключить дополнительный экземпляр контейнера, который создается в конструкторе BaseTest. Как подразумевалось выше, объект-контейнер станет доступен после создания экземпляра вашего объекта AppHost в OnTestFixtureSetUp.

+0

BOOM !! Спасибо приятель – iwayneo

Смежные вопросы