Тест Nunit не может загрузить файл из проекта вторичной библиотеки

Я пытаюсь запустить тесты nunit в отдельном тестовом проекте. Тесты работают нормально, когда включены в один и тот же проект, но когда я создаю тот же тест в отдельном проекте, они терпят неудачу. Однако, когда я создаю третий потребительский проект в решении, в этом проекте нет ошибок, вызывающих те же методы, которые тестируются здесь, поэтому проблема, похоже, связана с nunit. Ниже приведен минимальный пример, воссоздающий проблему.

using MyUtilities.FileIO.XML;
using NUnit.Framework;

[TestFixture]
public class ReaderTest
{
    private string FilePath { get; set; }
    private string FileName { get; set; }

    [Setup]
    public void Setup()
    {
        this.FilePath = @"c:\testdir\";
        this.FileName = "testfile.xml";
    }

    [Test]
    public void Reader_Test()
    {
        // Commenting out this line makes the test pass
        var reader = new XmlObjectReader<string> { FilePath = this.FilePath, FileName = this.FileName };

        Assert.True(true);
    }
}

Вызов XmlObjectReader вызывает FileLoadException в сборке MyUtilities, что приводит к сбою теста. Если я прокомментирую вызов, он работает нормально. Тот же тест отлично работает при выполнении из сборки. Ниже приведен точный язык исключений.

System.IO.FileLoadException : Could not load file or assembly 'MyUtilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The process cannot access the file because it is being used by another process. (Exception from HRESULT: 0x80070020)
   at MyUtilities.Test.FileIO.XML.XmlObjectReaderTest.Reader_Test()

Я не помню, чтобы мне приходилось делать какие-либо дополнительные настройки для nunit. Я использую VS 2013 в Windows 10, если это имеет значение. Ни одна из ссылок не сломана, и я не понимаю, почему какая-либо из них может быть заблокирована. Тем не менее, вот список ссылок в проекте MyUtilities, поскольку сообщение об ошибке, похоже, предполагает, что оно может быть одной из причин проблемы.

  • log4net
  • Microsoft.CSharp
  • nunit.framework
  • Система
  • System.ComponentModel.DataAnnotations
  • System.Core
  • Система.Данные
  • System.Data.DataSetExtensions
  • System.Xml
  • System.Xml.Linq

Я пытался отладить код .net (отключив «Только мой код»). Он отлично отлаживается с помощью метода установки, но сразу же умирает после выхода из метода установки и сразу же не проходит тест. У меня нет возможности отлаживать что-либо еще. Я в недоумении, что еще я могу сделать.

Изменить

Я обновил настройку с помощью соответствующих параметров свойств, которые я не смог указать изначально. Кроме того, ниже я включил реализацию XmlObjectReader.

public class XmlObjectReader<T> : IObjectReader<T>
{
    private static readonly ILog logFile = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    [Required]
    public string FilePath { get; set; }
    [Required]
    public string FileName { get; set; }
    [Required]
    public string FullPath { get { return Path.Combine(this.FilePath, this.FileName); } }

    public T ReadObject()
    {
        this.Validate();
        var returnValue = default(T);

        var serializer = new XmlSerializer(typeof(T));
        try
        {
            if (File.Exists(this.FullPath))
            {
                logFile.InfoFormat(Resources.DeserializingObject, this.FullPath);
                using (var stream = new FileStream(this.FullPath, FileMode.Open))
                using (var reader = XmlReader.Create(stream))
                {
                    if (serializer.CanDeserialize(reader))
                    { returnValue = (T)serializer.Deserialize(reader); }
                }
            }
        }
        catch (Exception ex)
        {
            logFile.ErrorFormat(Resources.ErrorDuringSerialization, ex);
        }

        return returnValue;
    }

    /// <summary>Determines whether the specified object is valid. </summary>
    /// <returns>A collection that holds failed-validation information. </returns>
    public void Validate()
    {
        var results = ValidatorHelper.ValidateObjectProperties(this);

        if (results.Any())
        {
            var message = string.Format(Resources.ObjectFailedValidation, this.GetType().Name, results);
            logFile.ErrorFormat(message);
            throw new ArgumentException(message);
        }
    }
}

person Travis    schedule 28.09.2015    source источник
comment
Вы предоставляете относительный FilePath классу XmlObjectReader?   -  person Nikhil Vartak    schedule 28.09.2015
comment
Я добавил дополнительную информацию, запрошенную в комментариях. Я полагаю, что закрыл все средства доступа к файловым объектам, и если бы я этого не сделал, я бы подумал, что это потерпит неудачу, когда тесты также будут в проекте. Чтобы ответить на вопрос vnikhil, дополнительная информация, которую я добавил, показывает пройденный путь - абсолютный.   -  person Travis    schedule 28.09.2015
comment
Мое внимание привлекла статическая инициализация ILog logFile. Вы используете GetCurrentMethod() для инициализации статического значения. Вы можете подтвердить это, создав статический конструктор, переместив в него инициализацию свойства logFile и ЗАТЕМ установив там точку останова. Имеет смысл, что это относится к проблеме, учитывая все, что я читал.   -  person Trevor Ash    schedule 28.09.2015
comment
@Atoms Я удалил все использования log4net из XmoObjectReader, включая объявление, и ошибка не устранена. Похоже, это не связано с log4net.   -  person Travis    schedule 28.09.2015


Ответы (1)


Отдельный тестовый проект должен ссылаться на проект MyUtilities, а свойство CopyLocal ссылки должно иметь значение true. См. https://msdn.microsoft.com/en-us/library/vstudio/t1zz5y8c(v=vs.100).aspx

person Richard Schneider    schedule 28.09.2015
comment
Он ссылается на MyUtilities, а CopyLocal имеет значение True. - person Travis; 28.09.2015