【问题标题】:Nunit test can't load file from secondary library projectNunit 测试无法从辅助库项目加载文件
【发布时间】:2015-09-28 13:26:08
【问题描述】:

我正在尝试在单独的测试项目中进行 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
  • System.Xml
  • System.Xml.Linq

我尝试调试到 .net 代码(关闭 Just My Code)。它通过 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);
        }
    }
}

【问题讨论】:

  • 您是否向 XmlObjectReader 类提供相对 FilePath?
  • 我添加了 cmets 中要求的其他信息。我相信我已经关闭了所有文件对象访问器,如果我没有关闭,我认为当测试也在项目中时它会失败。为了解决 vnikhil 的问题,我添加的附加信息显示了传递的路径 - 一个绝对路径。
  • ILog logFile 的静态初始化引起了我的注意。您正在使用 GetCurrentMethod() 来初始化静态值。您可以通过创建一个静态构造函数,在其中移动 logFile 属性的初始化,然后在那里设置一个断点来确认这一点。考虑到我所阅读的所有内容,这与问题有关是有道理的。
  • @Atoms 我从 XmoObjectReader 中删除了所有 log4net 用法,包括声明和错误仍然存​​在。它似乎与 log4net 无关。

标签: c# nunit .net-4.5


【解决方案1】:

单独的测试项目必须引用MyUtilities 项目并且引用的CopyLocal 属性必须为真。见https://msdn.microsoft.com/en-us/library/vstudio/t1zz5y8c(v=vs.100).aspx

【讨论】:

  • 它引用了 MyUtilities 并且 CopyLocal 为 True。
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多