2013-10-07 3 views
4

Je suis en train de passer quelques tests fonctionnels sur mon application, et je pense que je suis assez proche. Mon problème est que lorsque je lance mon premier test, j'obtiens l'erreur.ServiceStack AppHostHttpListenerBase Impossible de se connecter au serveur distant

Impossible de se connecter au serveur distant.

attendu: OK
Mais était: 0

Je peux confirmer que si je mets un point d'arrêt sur la Assertion, et puis essayer de frapper le BaseUrl dans mon navigateur, il ne se trouve pas.

Voici mon test.

[Test] 
public void MyTestTest() 
{ 
    var client = new RestClient(ServiceTestAppHostBase.BaseUrl); 
    // client.Authenticator = new HttpBasicAuthenticator(NUnitTestLoginName, NUnitTestLoginPassword); 
    var request = new RestRequest("https://stackoverflow.com/users/", Method.GET); 
    request.RequestFormat = DataFormat.Json; 
    var response = client.Execute(request); 

    // do assertions on the response object now 
    Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); 
} 

Le AppServerTestSetup ressemble à ceci

[SetUpFixture] 
public class AppServerTestSetup 
{ 
    ServiceTestAppHostBase _appHost; 

    [SetUp] 
    public void SetUp() 
    { 
     _appHost = new ServiceTestAppHostBase(); 
     _appHost.Init(); 
     _appHost.Start(ServiceTestAppHostBase.BaseUrl); 
    } 

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

Et le ServiceTestAppHostBase ressemble à ceci.

public class ServiceTestAppHostBase : AppHostHttpListenerBase 
{ 
    public const string BaseUrl = "http://localhost:8082/"; 
    public ServiceTestAppHostBase() : base("OurApp.AppServer", typeof(UserServiceInterface).Assembly) { } 

    public override void Configure (Container container) 
    { 
     JsConfig.EmitCamelCaseNames = true; 

     SetConfig(new EndpointHostConfig 
     { 
      MapExceptionToStatusCode = { 
       { typeof(NotFoundException), 404 }, // Map exception to 404 not found http response. 
       { typeof(SystemAccountChangeException), 405 } // Map exception to 405 method not allowed. 
      } 
     }); 

     // Shared Container Registration 
     AppHostContainerRegistrations.Register(container); 

     // Setup the database 
     var migrationRunner = container.Resolve<IMigrationRunner>(); 

     migrationRunner.CreateDatabase(); 
     migrationRunner.RunAll(); 
    } 
} 

Note: J'utilise aussi la AppHostContainerRegistrations dans l'application principale, et il fonctionne. J'ai également vérifié qu'il est exécuté dans la configuration de test. Le AppHostContainerRegistrations (par défaut) ressemble à ceci.

public class AppHostContainerRegistrations 
{ 
    public static void Register(Container container) 
    { 
     // IOC Registration 
     // Register base connection config 
     var dbConnection = ConfigurationManager.ConnectionStrings["databaseConnection"]; 
     var databaseName = ConfigurationManager.AppSettings["databaseName"]; 

     // Register Sqlserver DbProvider 
     container.Register<IDbConnectionProvider>(containr => new DbConnectionProvider(dbConnection.ConnectionString, dbConnection.ProviderName)); 
     container.Register<IDbProvider>(containr => new DbProvider(containr.Resolve<IDbConnectionProvider>(), databaseName)); 

     // Register repositories 
     container.RegisterAs<DatabaseVersionRepository, IDatabaseVersionRepository>(); 
     container.RegisterAs<UserRepository, IUserRepository>(); 
     container.RegisterAs<GroupRepository, IGroupRepository>(); 
     container.RegisterAs<DeviceRepository, IDeviceRepository>(); 
     container.RegisterAs<SecuritySettingsRepository, ISecuritySettingsRepository>(); 

     // Register services 
     container.RegisterAs<UserService, IUserService>(); 
     container.RegisterAs<GroupService, IGroupService>(); 
     container.RegisterAs<SecuritySettingsService, ISecuritySettingsService>(); 

     // Register everything else 
     container.RegisterAs<PasswordHasher, IPasswordHasher>(); 
     container.RegisterAs<MigrationRunner, IMigrationRunner>(); 

     container.Register(new UserModel { Id = new Guid("6C83DDEC-5E58-4F28-BDE2-61EBF1B49691") }); 

    } 
} 

La raison pour laquelle nous faisons notre configuration Db comme cela est parce que nous avons une seule chaîne de connexion et le nom db dans le App.Config, et nous comptons sur Transforms au cours du déploiement pour configurer la base de données.

Quelqu'un peut-il m'aider à résoudre ce problème?

+0

ServiceStack auto-branche et enregistre ses propres services, c'est-à-dire si 'UserService' est un ServiceStack' Service', supprimez l'enregistrement. – mythz

+0

@mythz Lorsque je supprime l'enregistrement, The SetUp lève une 'NullReferenceException' sur' _appHost.Init(); ' –

+0

et par" enregistrement "je suppose que vous faites référence à' public ServiceTestAppHostBase(): base ("OurApp.AppServer ", typeof (UserServiceInterface) .Assembly) {}' –

Répondre

5

Après une longue conversation avec @mythz, il s'avère que VS doit être exécuté en mode Admin pour que "AppHostHttpListenerBase" s'exécute.

Je dois également exécuter Powershell en tant qu'Admin lors de l'exécution ./build du terminal.

Questions connexes