在控制台应用程序及其单元测试中获取应用程序目录

时间:2014-09-09 16:01:48

标签: c# nunit resharper console-application shadow-copy

我在同一个项目中有一个带有NUnit测试的控制台应用程序项目。

我一直在尝试申请this solution

在运行时,解决方案正常运行。但是当我通过Resharper测试运行器或NUnit GUI运行器运行测试时,GetExecutingAssembly().Location返回了这样的路径:d:\Temp\f4ctjcmr.ofr\nojeuppd.fmf\R2Nbs\assembly\dl3\9766f38e\b9496fb3_43cccf01\
禁用阴影复制修复了两个测试运行器中的问题,但出现了新问题(在NUnit Gui关闭之前,VS无法构建项目)。有没有比禁用阴影复制更好的解决方案?

更新: Environment.GetCommandLineArgs()[0]在NUnit Gui中运行的测试中返回C:\Program Files (x86)\NUnit 2.6.3\bin\并启用了阴影复制。

2 个答案:

答案 0 :(得分:1)

好吧,这进入了有趣的领域。

你应该嘲笑这种依赖。

示例代码:

public interface IApplicationRootService {
    Uri GetApplicationRoot();
}

public class ApplicationRootService : IApplicationRootService {
    public Uri GetApplicationRoot() {
        //etc
    }
}

现在,请自由地应用于您调用getexecutingassembly等等的代码。将IApplicationRootService注入构造函数依赖项。

例如:

public class DoWork {
    private IApplicationRootService _applicationRootService;
    public DoWork(IApplicationRootService applicationRootService) {
        _applicationRootService = applicationRootService;
    }
    public void DoSomething() {
        var appRoot = _applicationRooService.GetApplicationRoot();
        //do your stuff
    }
}

现在,当您进行测试时,请使用模拟服务并将应用程序根目录的返回值模拟到相应的文件夹中,以便nunit进行嗅探。

Ex代码,使用nunit和moq:

[Test]
public static void test_do_something() {
    var applicationRootService = new Mock<IApplicationRootService>();
    applicationRootService.Setup(service => service.GetApplicationRoot()).Returns(new Uri("MyRoot", UriKind.Relative);
    var myClass = new DoWork(applicationRootService.Object);
    //continue testing!
}

答案 1 :(得分:0)

following解决方案对我有用。如果有帮助,请投票给作者。

正如MSDN论坛帖子How to convert URI path to normal filepath?中所述,我使用了以下内容:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
        System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;