2017-07-18 2 views
2

Ich erhalte einen Fehler, wenn ich versuche, einige Tests auf meinem ServiceStack-Webdienst auszuführen. Ich verwende ServiceStack 4.5.8 und Nunit 3.5. Die Lösung wurde ursprünglich aus einer ServiceStackVS-Vorlage erstellt.System.IO.InvalidDataException: ServiceStackHost.Instance wurde bereits festgelegt (BasicAppHost)

Der Fehler, die auf einer Reihe von Tests angezeigt wird, ist

System.IO.InvalidDataException : ServiceStackHost.Instance has already been set (BasicAppHost)</br> 
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.</br> 
    at ServiceStack.ServiceStackHost.Init()</br> 
    at MyApp.Tests.EchoServiceUnitTests.OneTimeSetup() in </br> 
C:\Repos\MyApp\Myapp\MyApp.Tests\EchoServiceUnitTests.cs:line 45 </br> 
--TearDown</br> 
    at MyApp.Tests.EchoServiceUnitTests.TestFixtureTearDown() in </br>C:\Repos\MyApp\MyApp\MyApp.Tests\EchoServiceUnitTests.cs:line 54 

Einer der Tests, die diesen Fehler regelmäßig erzeugt hierfür

namespace Tests 
{ 

    [TestFixture] 
    public class EchoServiceUnitTests 
     { 

      private ServiceStackHost appHost; 

      [OneTimeSetUp] 
      public void OneTimeSetup() 
       { 
        this.appHost = new BasicAppHost(typeof(EchoService).Assembly).Init(); 
       } 


      [OneTimeTearDown] 
      public void TestFixtureTearDown() 
       { 
        this.appHost.Dispose(); 

       } 


      [Test] 
      public void TestService() 
       { 
        const string Message = "Hello"; 

        var service = this.appHost.Container.Resolve <EchoService>(); 

        var response = (EchoResponse)service.Any(new Echo 
                   { 
                    Message = Message 
                   }); 

        Assert.That(response.Message, 
           Is.EqualTo(Message)); 
       } 
     } 
} 

der Service ist

namespace ServiceInterface 
{ 

    public class EchoService : Service 
     { 
       public object Any(Echo request) 
       { 
        return new EchoResponse {Message = request.Message}; 
       } 
     } 
} 

[Route("/Echo")] 
[Route("/Echo/{Message}")] 
public class Echo : IReturn<EchoResponse> 
{ 

    public string Message { get; set; } 

} 

    public class EchoResponse : IHasResponseStatus 
{ 
     public EchoResponse() 
    { 
     this.ResponseStatus = new ResponseStatus(); 
    } 

    public string Message { get; set; } 

    public ResponseStatus ResponseStatus { get; set; } 

} 

Und schließlich meine apphost

namespace MyApplication 
{ 
    using System; 

    using Funq; 

    using ServiceInterface; 
    using ServiceModel.Validators; 

    using ServiceStack; 
    using ServiceStack.Admin; 
    using ServiceStack.Api.Swagger; 
    using ServiceStack.Caching; 
    using ServiceStack.Configuration; 
    using ServiceStack.Logging; 
    using ServiceStack.Logging.NLogger; 
    using ServiceStack.MsgPack; 
    using ServiceStack.OrmLite; 
    using ServiceStack.OrmLite.SqlServer.Converters; 
    using ServiceStack.ProtoBuf; 
    using ServiceStack.Razor; 
    using ServiceStack.Validation; 
    using ServiceStack.VirtualPath; 
    using ServiceStack.Wire; 


    public class AppHost : AppHostBase 
     { 

      public static ILog Log = LogManager.GetLogger(typeof(AppHost)); 

       public AppHost() 
       : base("MyApp", 
         typeof(HelloService).Assembly) { } 


      public override void Configure(Container container) 
       { 
        LogManager.LogFactory = new NLogFactory(); 

        Log = LogManager.GetLogger(this.GetType()); 

        this.Plugins.Add(new RazorFormat()); 

        this.Plugins.Add(new PostmanFeature()); 

        this.Plugins.Add(new SwaggerFeature()); 

        this.Plugins.Add(new AdminFeature()); 

        var ormSettings = new AppSettings(); 

        container.Register <ICacheClient>(new MemoryCacheClient()); 

        var dbFactory = new OrmLiteConnectionFactory(ormSettings.GetString("SqlDbConnection"), 
                   SqlServerDialect.Provider); 


        dbFactory.RegisterConnection("Database2", 
               ormSettings.GetString("Sql2Connection"), 
               SqlServerDialect.Provider); 

     SqlServerDialect.Provider.RegisterConverter<DateTime?>(new SqlServerDateTimeConverter()); 

     this.Plugins.Add(new RequestLogsFeature 
             { 
              RequestLogger = new CsvRequestLogger(files: new FileSystemVirtualPathProvider(this, 
                                  this.Config.WebHostPhysicalPath), 
                        requestLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}.csv", 
                        errorLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}-errors.csv", 
                        appendEvery: TimeSpan.FromSeconds(1)), 
              EnableRequestBodyTracking = true, 
              EnableResponseTracking = true, 
              EnableErrorTracking = true, 
             }); 

        this.Plugins.Add(new AutoQueryDataFeature 
             { 
              MaxLimit = 1000 
             }); 

        this.Plugins.Add(new AutoQueryFeature()); 

        var sse = new ServerEventsFeature 
            { 
             StreamPath = "/event-stream", 

             HeartbeatPath = "/event-heartbeat", 

             UnRegisterPath = "/event-unregister", 

             SubscribersPath = "/event-subscribers", 

             LimitToAuthenticatedUsers = false, 

             IdleTimeout = TimeSpan.FromSeconds(30), 

             HeartbeatInterval = TimeSpan.FromSeconds(10), 

             NotifyChannelOfSubscriptions = true, 
            }; 

        this.Plugins.Add(sse); 
        Plugins.Add(new AdminFeature()); 

        Plugins.Add(new WireFormat()); 
        Plugins.Add(new MsgPackFormat()); 
        Plugins.Add(new ProtoBufFormat()); 

       } 
     } 
} 

Ich habe eine Vielzahl von Vorschlägen versucht, einschließlich der Apphost im Test statisch, aber nichts scheint für mich zu arbeiten. Ich versuchte dann den folgenden Test, der auch den gleichen Fehler erzeugte, der mir vorschlägt, dass es etwas im apphost gibt, das falsch ist, aber ich kann was nicht sehen.

 [TestFixture(Category = "AppHost")] 
    public class AppHostTests 
     { 
      /// <summary> 
      /// The app host doesnt throw exception. 
      /// </summary> 
      [Test] 
      public void AppHostDoesntThrowException() 
       { 
        var apphost = new AppHost(); 
        Assert.That(() => apphost.Init(), 
           Throws.Nothing); 
       } 
     } 

Die Tests, die diesen Fehler erzeugen, ob ich NCRUNCH bin mit (Set einen nach dem anderen ausgeführt werden) oder wenn ich resharpers ausführen verwenden, um alle Tests. Es sind im Allgemeinen die gleichen Tests, die diesen Fehler erzeugen, obwohl das zu variieren scheint. Wenn ich die Tests dann manuell durchführe, werden sie alle bestanden.

Antwort

2

Sie können nur 1 AppHost initialisieren und gleichzeitig ausführen, wenn NCrunch-Test ausgeführt wird, während ein anderer AppHost noch verwendet wird. Vielleicht können Sie versuchen, einen Debugpoint zu debuggen und einen Haltepunkt zu setzen, der prüft, ob ServiceStackHost.Instance nicht null ist, bevor Sie versuchen, einen anderen AppHost zu initialisieren.

Beachten Sie, dass die AppHostBase eine ASP.NET-Webanwendung ist, die die Störung verursacht, wenn sie im selben Projekt wie die Komponententests ausgeführt wird. Wenn Sie einen Integrationstest durchführen möchten, verwenden Sie stattdessen AppSelfHostBase, das Sie anstelle von BasicAppHost verwenden würden, wo Sie einen vollständigen Integrationstest durchführen möchten.

+0

Danke wie immer für Ihre schnelle Antwort Mythz, ich bin mir nicht sicher, es ist NCrunch speziell, wie es auch passiert, wenn ich Resharper verwende, um alle Tests zu laufen. Ich werde Ihren Debug-Tipp sicherlich versuchen – steve

Verwandte Themen