2015-09-28 78 views
0

我想要在单独的测试项目中进行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的调用会导致MyUtilities程序集上的FileLoadException,从而导致测试失败。如果我评论这个电话,它可以正常工作。从程序集内执行时,相同的测试工作正常。以下是确切的异常语言。

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。如果有问题,我在Windows 10中使用VS 2013。没有参考文献被打破,我不明白为什么他们中的任何一个会被锁定。不过,这里是MyUtilities项目中的参考列表,因为错误消息似乎认为它可能是导致问题的那些之一。

  • log4net的
  • Microsoft.CSharp
  • nunit.framework
  • 系统
  • System.ComponentModel.DataAnnotations
  • System.Core程序
  • System.Data
  • System.Data。 DataSetExtensions
  • S ystem.Xml
  • System.Xml.Linq的

我试着调试到.NET代码(关闭仅我的代码)。它通过Setup方法调试得很好,但在退出Setup方法后立即死亡,并立即失败。我没有机会调试其他任何东西。对于我可能做什么,我感到不知所措。

编辑

我已经更新了,我没有最初提供相应的属性设置的设置。另外,我在下面包含了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); 
     } 
    } 
} 
+0

您是否将相对FilePath提供给XmlObjectReader类? – niksofteng

+0

我已在评论中添加了所需的其他信息。我相信我已经关闭了所有的文件对象访问器,如果我没有,我会认为当测试在项目中时也会失败。为了解决vnikhil的问题,我添加的附加信息显示了传递的路径 - 绝对路径。 – Travis

+0

ILog logFile的静态初始化引起了我的注意。您正在使用GetCurrentMethod()来初始化一个静态值。您可以通过创建一个静态构造函数,移动logFile属性的初始化来确认,然后在那里设置一个中断点。这是有道理的,这涉及到我读过的所有内容。 –

回答

相关问题