Тестовый проект NUnit C #, ссылающийся на другую DLL - PullRequest
6 голосов
/ 21 ноября 2011

Я просмотрел несколько проблем с nunit и visual studio, описанных в stackoverflow, но не могу найти ни одной нити, подходящей для моего случая.

Я использую NUnit для тестирования написанного мной кода, загружаю файл * .csproj моего тестового проекта в NUnit GUI Tool.

Я понял проблему, думаю, но пока не нашел решения. Что я делаю:

Я ссылаюсь на 2 других проекта, оба являются dll-проектами. Это означает, что я получил 3 проекта: TestProject (DLL), SettingsManager (DLL), DatabaseInterface (DLL). Все в одном решении. Проект DatabaseInterface содержит собственные вызовы API-интерфейса к другой, C ++ x86, DLL, но не содержит явной ссылки на эту DLL с помощью оператора «using».

Одним из обоих является SettingsManager, хранящий некоторые данные конфигурации, такие как пути и т. Д., Но в любом случае. И Testproject, и DatabaseInterface ссылаются на SettingsManager.

Все 3 проекта встроены в «Debug» и в «AnyCPU». Ссылка и использование только SettingsManager в моем TestProject работает нормально, но когда я добавляю DatabaseInterface, я получаю исключение BadImageFormatException, сообщающее, что оно пытается загрузить файл, имеющий неправильный формат.

Чтобы сделать его более заметным, это работает:

using myNamespace.Settings; // contains SettingsManager
using System;
using NUnit.Framework;

namespace myNamespace.myTestProject
{
    [TestFixture]
    public class TestProject
    {
        [SetUp]
        public void SetUp()
        {

        }

        [Test]
        public void ReadDbFile()
        {
            string s = SettingsManager.DbFile; // gets the path of the db file
        }
    }
}

NUnit Выход:

Это не работает:

using myNamespace.Settings; // contains SettingsManager
using myNamespace.DbInterface; // contains DatabaseInterface, which contains native calls to C++ dll
using System;
using NUnit.Framework;

namespace myNamespace.myTestProject
{
    [TestFixture]
    public class TestProject
    {
        DatabaseInterface instance = null;
        [SetUp]
        public void SetUp()
        {

        }

        [Test]
        public void ReadDbFile()
        {
            string s = SettingsManager.DbFile; // gets the path of the db file
        }
    }
}

Вторая попытка, содержащая

using myNamespace.DbInterface;

бросает myNamespace.myTestProject.TestProject (TestFixtureSetUp): SetUp: System.BadImageFormatException: сборка даты и даты "DatabaseInterface, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null" или ссылка не найдена. Попытка загрузить файл неправильного формата. "

, даже если все 3 проекта собраны с использованием Отладка и AnyCPU .

Я использую стандартный файл * .config, такой как файл тестового проекта NUnit. Может быть, некоторые не так с этим.

Кто-нибудь сталкивался с такой же ошибкой при попытке загрузить код из другой DLL? Может ли быть проблемой, что оба проекта (Test & Database) ссылаются на DLL-библиотеку SettingsManager? Я сделал что-то серьезное неправильно?

Я дважды проверил свою конфигурацию сборки во всех 3 проектах, но не смог найти какие-либо настройки, которые могут быть неправильными, и объясняет BadImageFormatException .

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

Скорее всего, вы используете nunit.exe GUI runner, который предназначен для любого процессора.Это будет JIT, скомпилированный для целевой платформы, которая, как я полагаю, представляет собой x64, поскольку у вас возникла эта проблема.Вместо этого попробуйте использовать nunit-x86.exe для запуска ваших тестов.Эта версия GUI Runner специально предназначена для запуска в 32-разрядном процессе, который будет совместим с вашей зависимостью от библиотеки DatabaseInterface.

1 голос
/ 21 ноября 2011

Это может быть проблема зависимости ваших зависимостей. Это может произойти, если ваша зависимость зависит от неуправляемой библиотеки COM x86, а вы работаете на x64. Все будет работать нормально, пока вы не попытаетесь использовать эту зависимость в своем коде - он выдаст BadImageFormatException.

Чтобы преодолеть это, вы должны добавить конкретную цель (x86 или x64) в ваш проект, и попробуйте с этим.

...