0

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

我一直在尝试应用此解决方案

在运行时,该解决方案工作正常。但是当我通过 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\

4

2 回答 2

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!
}
于 2014-09-09T16:12:35.437 回答
0

以下解决方案对我有用如果对您有帮助,请投票给它的作者。

如 MSDN 论坛帖子中所述,如何将 URI 路径转换为普通文件路径?,我使用了以下内容:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
        System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;
于 2014-09-09T16:43:12.380 回答