Я пытаюсь запустить тесты 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);
}
}
}