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
  • System.Data.DataSetExtensions
  • System.Xml
  • System.Xml.Linq

Опитах се да отстраня грешки в .net кода (изключвайки Just My Code). Отстранява грешки съвсем добре чрез метода за настройка, но умира незабавно при излизане от метода за настройка и веднага се проваля на теста. Нямам възможност да отстранявам грешки в нещо друго. Не знам какво друго мога да направя.

Редактиране

Актуализирах настройката с подходящите настройки на свойствата, които не успях да предоставя първоначално. Освен това съм включил внедряването на 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 на препратката трябва да е вярно. Вижте 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