2012-08-23 31 views
0

我正在使用RavenDB開發應用程序。我有針對嵌入式內存數據庫的自動化測試。當我引用Raven build 2033-Unstable時,所有測試都正常工作。我升級到構建2067-Unstable(現在爲2069),並且在通過TeamCity(7.1 build 23907)運行時,每次NUnit測試都會發生異常。所有測試在通過R#或NUnit GUI運行時運行良好。使用嵌入式RavenDB的自動化測試在TeamCity上失敗,但在通過R#或NUnit運行時不會失敗

我收到的例外似乎是012ven裏面的烏鴉在Raven.Bundles.Versioning.Triggers.VersioningPutTrigger.AllowPut(String key, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Bundles\Versioning\Triggers\VersioningPutTrigger.cs:line 22。我甚至沒有使用Versioning包。

下面是完整的堆棧跟蹤:

Test(s) failed. Autofac.Core.DependencyResolutionException : An exception was thrown while executing a resolve operation. See the InnerException for details. 
    ----> System.NullReferenceException : Object reference not set to an instance of an object. 
    at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters) 
    at AppCenter.Tests.Fixture.Resolve[TService]() in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Tests\Fixture.cs:line 40 
    at AppCenter.Tests.Fixture.get_Raven() in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Tests\Fixture.cs:line 22 
    at AppCenter.Tests.Fixture.Store[T](T entity) in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Tests\Fixture.cs:line 50 
    at AppCenter.Tests.AppAdmin.ApplicationEditTests.TestLoad() in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Tests\AppAdmin\ApplicationEditTests.cs:line 20 
--NullReferenceException 
    at Raven.Bundles.Versioning.Triggers.VersioningPutTrigger.AllowPut(String key, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Bundles\Versioning\Triggers\VersioningPutTrigger.cs:line 22 
    at Raven.Database.DocumentDatabase.<>c__DisplayClass42.<AssertPutOperationNotVetoed>b__3f(AbstractPutTrigger trigger) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 601 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Raven.Database.DocumentDatabase.AssertPutOperationNotVetoed(String key, RavenJObject metadata, RavenJObject document, TransactionInformation transactionInformation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 600 
    at Raven.Database.DocumentDatabase.<>c__DisplayClass3a.<Put>b__33(IStorageActionsAccessor actions) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 551 
    at Raven.Storage.Managed.TransactionalStorage.ExecuteBatch(Action`1 action) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Storage\Managed\TransactionalStorage.cs:line 131 
    at Raven.Storage.Managed.TransactionalStorage.Batch(Action`1 action) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Storage\Managed\TransactionalStorage.cs:line 112 
    at Raven.Database.DocumentDatabase.Put(String key, Nullable`1 etag, RavenJObject document, RavenJObject metadata, TransactionInformation transactionInformation) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 543 
    at Raven.Bundles.Encryption.Settings.EncryptionSettingsManager.VerifyEncryptionKey(DocumentDatabase database, EncryptionSettings settings) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Bundles\Encryption\Settings\EncryptionSettingsManager.cs:line 114 
    at Raven.Database.Extensions.EnumerableExtensions.Apply[T](IEnumerable`1 self, Action`1 action) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\Extensions\EnumerableExtensions.cs:line 18 
    at Raven.Database.DocumentDatabase.InitializeTriggersExceptIndexCodecs() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 221 
    at Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration configuration) in c:\Builds\RavenDB-Unstable-v1.2\Raven.Database\DocumentDatabase.cs:line 200 
    at Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Embedded\EmbeddableDocumentStore.cs:line 208 
    at Raven.Client.Document.DocumentStore.Initialize() in c:\Builds\RavenDB-Unstable-v1.2\Raven.Client.Lightweight\Document\DocumentStore.cs:line 431 
    at AppCenter.Config.RavenModule.Initialize(DocumentStoreBase store) in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Framework\Config\RavenModule.cs:line 32 
    at AppCenter.Tests.RavenInMemoryModule.<Load>b__1(IActivatingEventArgs`1 a) in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Tests\RavenInMemoryModule.cs:line 25 
    at Autofac.Builder.RegistrationBuilder`3.<>c__DisplayClass6.<OnActivating>b__5(Object s, ActivatingEventArgs`1 e) 
    at Autofac.Core.Registration.ComponentRegistration.RaiseActivating(IComponentContext context, IEnumerable`1 parameters, Object& instance) 
    at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) 
    at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator) 
    at Autofac.Core.Resolving.InstanceLookup.Execute() 
    at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p) 
    at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.InstanceLookup.Execute() 
    at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) 
    at Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters) 
    at AppCenter.Config.RavenModule.<Load>b__1(IComponentContext c) in c:\TeamCity\buildAgent\work\994e66c6c107022f\AppCenter.Framework\Config\RavenModule.cs:line 19 
    at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p) 
    at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) 
    at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator) 
    at Autofac.Core.Resolving.InstanceLookup.Execute() 
    at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.Builder.RegistrationBuilder.<>c__DisplayClass1`1.<ForDelegate>b__0(IComponentContext c, IEnumerable`1 p) 
    at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.InstanceLookup.Execute() 
    at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) 
    at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) 

我使用Autofac接線起來,而代碼如下:

protected override void Load(ContainerBuilder builder) 
    { 
     builder.Register(c => new EmbeddableDocumentStore 
           { 
            RunInMemory = true, 
            Configuration = 
             { 
              PluginsDirectory = GetPluginsDirectory() 
             } 
           }) 
      .OnActivating(a => RavenModule.Initialize(a.Instance)) 
      .As<IDocumentStore>() 
      .Named<IDocumentStore>("test") 
      .InstancePerLifetimeScope(); 
    } 

    private static string GetPluginsDirectory() 
    { 
     return Path.GetDirectoryName(typeof (UniqueConstraintsPutTrigger).Assembly.Location); 
    } 

    public static void Initialize(DocumentStoreBase store) 
    { 
     store.RegisterListener(new UniqueConstraintsStoreListener()); 
     store.Initialize(); 
     IndexCreation.CreateIndexes(typeof (RavenModule).Assembly, store); 
     RequireTrigger(store, typeof (UniqueConstraintsPutTrigger)); 
    } 

    private static void RequireTrigger(IDocumentStore store, Type triggerType) 
    { 
     var installedTriggerNames = store.DatabaseCommands.GetStatistics().Triggers.Select(t => t.Name); 

     if (!installedTriggerNames.Contains(triggerType.ToString())) 
     { 
      throw new Exception(string.Format(
       "The required trigger '{0}' was not detected. Verify the bundle '{1}' been installed into the" + 
       " server's plugins directory.", 
       triggerType, Path.GetFileName(triggerType.Assembly.Location))); 
     } 
    } 
+1

我要檢查的第一件事是在構建服務器上驗證Raven的程序集與您期望的相同。 –

+0

我已經做到了;甚至直接在我的機器上直接從編譯服務器運行編譯後的程序集而沒有錯誤這是真正令人沮喪的部分。 –

+0

接下來的步驟是減少複雜性,直到你可以得到真正發生的事情,我將開始移除autofac,並根據需要用一些輔助類來連接,或者使用無參數構造函數來使用窮人的依賴注入 –

回答

3

解決。將PluginsDirectory設置爲與所有其他DLL相同的文件夾,尤其是Raven.Database.dll,導致該DLL中嵌入的所有插件也被無意加載。並不是所有的Raven插件一起工作,所以加載它們都會導致異常。通過製作一個單獨的Plugins目錄,並將Raven.Bundles.UniqueConstraints.dll複製到發生異常停止的位置。

我仍然不明白爲什麼它只從構建服務器失敗;它似乎也應該在本地失敗。

相關問題