2016-02-26 2 views
0

Я разрабатываю приложение Xamarin, которое использует базу данных SQLite, у нас есть модульное тестирование для покрытия этой функциональности.Xamarin SQLite Unit Testing 64-разрядная Windows

Эти модульные тесты выполняют и передают машину OS X, но мы видим ошибки, связанные с SQLite, при их запуске в Windows 8 (64-разрядной) VM (это действует как подчиненный внутри инфраструктуры CI).

Ошибка мы видим, происходит от NUnit (2.6.4), когда тесты запуска

ProcessModel: Default DomainUsage: Single 
Execution Runtime: net-4.5 
Unhandled Exception: 
System.BadImageFormatException: Could not load file or assembly 'App.Core.Tests, Version=1.0.5900.25009, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
File name: 'App.Core.Tests, Version=1.0.5900.25009, Culture=neutral, PublicKeyToken=null' 

Server stack trace: 
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
at NUnit.Core.Builders.TestAssemblyBuilder.Load(String path) 
at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, Boolean autoSuites) 
at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, String testName, Boolean autoSuites) 
at NUnit.Core.TestSuiteBuilder.BuildSingleAssembly(TestPackage package) 
at NUnit.Core.TestSuiteBuilder.Build(TestPackage package) 
at NUnit.Core.SimpleTestRunner.Load(TestPackage package) 
at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
at NUnit.Core.ProxyTestRunner.Load(TestPackage package) 
at NUnit.Core.RemoteTestRunner.Load(TestPackage package) 
at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs) 
at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Object[]& outArgs) 
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
at NUnit.Core.TestRunner.Load(TestPackage package) 
at NUnit.Util.TestDomain.Load(TestPackage package) 
at NUnit.ConsoleRunner.ConsoleUi.Execute(ConsoleOptions options) 
at NUnit.ConsoleRunner.Runner.Main(String[] args) 

Это связано с тем, что были с использованием 64-битных Windows?

+0

, кажется, вы пытаетесь загрузите x64 libary на процесс x86 ... – Gusman

ответ

2

BadImageFormat почти всегда потому, что существует несоответствие между битностью выполняемого процесса и битностью зависимой сборки. Как вы, наверное, знаете, Sqlite не AnyCPU, а x86 или x64. Вероятно, ваш тестовый пакет скомпилирован AnyCPU, но вы используете 32-разрядную версию Sqlite.

NUnit 3 автоматически определит битту вашего тестового набора (но не зависимых сборок) и запустит его правильно. NUnit 2 не будет, и вы должны соответствующим образом выполнить свои тесты. Из NUnit 2.6 Документах

версии .NET 2.0 программы NUnit-консоль построена с использованием/платформы: AnyCPU, которая заставляет его быть JIT-компилируется в 32-битного кода на 32-битной системе и 64-битный код в 64-битной системе. Это вызывает исключение, когда NUnit используется для тестирования 32-разрядного приложения в 64-разрядной системе. Чтобы избежать этой проблемы, используйте программу nunit-console-x86, которая построена с использованием/platform: x86 при тестировании 32-разрядного кода в 64-разрядной системе.

Плохо написано, и мы должны, вероятно, исправить это, но я бы порекомендовал две вещи;

  1. Убедитесь, что ваши испытания сборки цели x86/x64, чтобы соответствовать Sqlite
  2. Если вы используете x86, запустить тесты с NUnit-консоль-X86.exe
+0

Отлично! Спасибо за быстрый ответ после ваших шагов, исправил проблему, – user3617723