NUnit中的Assembly.GetEntryAssembly()

时间:2014-10-08 10:24:13

标签: c# nunit .net-assembly

我正在使用NUnit来测试我需要将XML文件加载到对象的一个​​功能。 XML文件位于控制台应用程序的位置。

我有以下方法,其中将读取配置:

public string GetConfiguration(TempFlexProcessor processor)
{
    var exePath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    var configPath = Path.Combine(Path.GetFullPath(exePath), "configuration");
    var configFile = string.Format(@"{0}.xml", processor.GetType().Name);
} 

现在在我的NUnit测试中我有测试方法,我测试GetConfiguration:

[Test]
    public void TempFlexProcessorExecuteTest()
    {
        #region Given


        #endregion

        #region When

        var tempFlexProcessor = new TempFlexProcessor();
        var actual = tempFlexProcessor.GetConfiguration(tempFlexProcessor);

        #endregion

        Assert.AreEqual("path of the file", actual);
    }

但System.Reflection.Assembly.GetEntryAssembly()为null,请帮忙。

2 个答案:

答案 0 :(得分:1)

我怀疑问题是NUnit正在不同的AppDomain中运行您的测试,但没有使用ExecuteAssembly。来自documentation for Assembly.GetEntryAssembly

  

获取默认应用程序域中的进程可执行文件。在其他应用程序域中,这是AppDomain.ExecuteAssembly执行的第一个可执行文件。

目前还不清楚你真正希望获得哪个程序集 - 即使这个 为NUnit返回“适当”的东西,这可能是NUnit可执行文件,它远离任何配置目录你碰巧有。

基本上,我认为你应该至少提供另一种指定配置目录的方式 - 而可能想重新考虑是否使用GetEntryAssembly是无论如何,这是个好主意。 (除了其他任何事情,你在处理器上调用GetConfiguration并传入另一个处理器......这可能适合你的设计有点奇怪,但考虑到你的测试,它至少有点不寻常你传递对同一个对象的引用的情况。)

答案 1 :(得分:1)

我使用AppDomain.CurrentDomain.BaseDirectory代替System.Reflection.Assembly.GetEntryAssembly().Location