2017-07-18 28 views
2

當我嘗試在我的servicestack web服務上運行一些測試時出現錯誤。 我正在使用ServiceStack 4.5.8和Nunit 3.5。該解決方案最初是從ServiceStackVS模板創建的。System.IO.InvalidDataException:ServiceStackHost.Instance已被設置(BasicAppHost)

的錯誤,這出現在多項測試,是

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 

一個定期產生這種錯誤的測試是

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)); 
       } 
     } 
} 

此服務是

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; } 

} 

最後我的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()); 

       } 
     } 
} 

我已經嘗試了各種各樣的建議,包括使測試中的apphost靜態,但似乎沒有爲我工作。然後我嘗試了下面的測試,這也產生了同樣的錯誤,這暗示了apphost中存在錯誤的東西,但我看不到它。

 [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); 
       } 
     } 

我是否使用NCRUNCH產生這種錯誤的測試(設置爲運行一次一個),或者如果我使用resharpers運行所有測試。這通常是產生這個錯誤的相同測試,儘管這似乎有所不同。在所有情況下,如果我手動運行測試,它們都會通過。

回答

2

您只能有一個AppHost初始化並同時運行,在某種程度上正在運行NCrunch測試,而另一個AppHost仍在使用中。也許你可以嘗試調試並設置一個斷點,在嘗試初始化另一個AppHost之前檢查ServiceStackHost.Instance是否爲空。

請注意,AppHostBase是一個ASP.NET Web應用程序,如果它在與單元測試相同的項目中運行,可能會造成干擾。如果您想要進行集成測試,請使用AppSelfHostBase,而不是您想要運行完整集成測試的BasicAppHost。

+0

非常感謝您的及時響應Mythz,我不確定它是否是NCrunch,因爲當我使用Resharper運行所有測試時,它也會發生。我一定會試一試你的調試技巧 – steve

相關問題