0

同じプロジェクトに NUnit テストを含むコンソール アプリケーション プロジェクトがあります。

私はこの解決策を適用しようとしています。

実行時にソリューションは正常に機能しました。しかし、Resharper テスト ランナーまたは NUnit GUI ランナーでテストを実行すると、次GetExecutingAssembly().Locationのようなパスが返されましたd:\Temp\f4ctjcmr.ofr\nojeuppd.fmf\R2Nbs\assembly\dl3\9766f38e\b9496fb3_43cccf01\
シャドウ コピーを無効にすると、両方のテスト ランナーの問題が修正されましたが、新しい問題が発生しました (NUnit Gui を閉じるまで、VS はプロジェクトをビルドできません)。シャドウコピーを無効にするよりも良い解決策はありますか?

更新: シャドウ コピーが有効になっている NUnit Gui で実行されているテストでEnvironment.GetCommandLineArgs()[0]返されます。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 がスニッフィングします。

nunit と moq を使用した Ex コード:

[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 に答える