2017-02-27 9 views
0

私はCodedUIテスト自動化フレームワークの新機能です。私はTestContextに出くわしました。テスト結果の出力とディレクトリに関する重要な情報があります。 実際には、出力データを.txtファイルに書き込む静的なLoggerクラスを作成しました。今私はそれをTestResultsの下に作成したいと思います。テストメソッドを実行するたびに、タイムスタンプが続くフォルダが作成されます。その場所に私のResults.txtファイルを作成したいと思います。 以下は、私が使用していたコードです:静的クラスのデータメンバーにTextContext.TestDeploymentDirの値を割り当てることはできますか?

public static class Logger 
{ 

    string logLocation = TestContext.TestDeploymentDir + "\\Results.txt"; 


    static Logger() { 
     File.Create(logLocation); 
     using (var fs = new FileStream(logLocation, FileMode.Truncate)) 
     { 
     } 
    } 

    public static void ResultLog(int testcasenum,String Expected,String Actual, String textResult) 
    { 

     FileInfo outtxt = new FileInfo(logLocation); 

     StreamWriter logline = outtxt.AppendText(); 


     logline.WriteLine("Test Case : " + testcasenum); 
     logline.WriteLine("{0},{1},{2}", "Expected - "+Expected, "Actual - "+Actual, "Result - "+textResult); 

     // flush and close file. 

     logline.Flush(); logline.Close(); 


    } 
} 

は、今私はA field initializer cannot reference the non-static field, method, or property TestContext.TestDeploymentDir.がわからないどのようにこのエラーを解決するか、それが可能かどうかと言って、コンパイル時エラーを取得していますか?

+0

コンストラクタは何を目的としていますか? 'var fs 'のスコープは空の' using'ブロックに限定されているので、おそらく出力ストリームを空にする以外の有効な効果はありません。 – AdrianHHH

+0

@AdrianHHHログファイルを切り捨てているだけです。何もする特定のロジックがありません。ここでファイルを空にするだけです。 –

答えて

0

logLocationは静的なクラスに含まれているため、静的にする必要があります。それはまあまあですが、静的クラスのすべてのメンバーも静的とマークする必要があります。これは、クラス宣言が見えない大きなクラスを読むときに混乱を避けるためだと思います。次に現在のエラーメッセージにはTestContextと表示されます。 TestDeploymentDirは静的にマークされていないので、可能であれば修正する必要があります。そうでなければ、そのクラスのインスタンスの静的コピーを提供するためにシングルトンパターンを実装する必要があります。クラスの仕方によっては、可能かもしれないし、そうでないかもしれません。

+0

'TestContext'はシステム定義のDLLの抽象クラスです。私はそれを変更することができますか分からない。また、静的な 'logLocation'を作成しようとしましたが、同じエラーを表示していました。 –

+0

だから確実に確実に 'logLocation'を静的に保つ必要があります。コンパイラがそれほど大きな問題を抱えていないので、まだそのエラーは表示されません。 'TestContext'が抽象クラスで、' TestDeploymentDir'がインスタンスメンバであれば(抽象クラ​​スを実装し、abstractでマークされたメンバを実装する必要があります)、シングルトンパターンを作成する必要があります静的インスタンスを取得します。次に、フィールドイニシャライザで静的インスタンスにアクセスできます。少し迷惑な、しかし完全に可能です。 – Licht

0

最後にフレームワークのoutパスを取得する方法を見つけました。

public static class Logger 
{ 
    static string uripath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\Results.txt"; 
    public static string logLocation = new Uri(uripath).LocalPath; 

    static Logger() { 

     using (File.Create(logLocation)) 
     { } 
     using (var fs = new FileStream(logLocation, FileMode.Truncate)){} 
    } 
    public static void ResultLog(int testcasenum,String Expected,String Actual, String textResult) 
    { 

     FileInfo outtxt = new FileInfo(logLocation); 

     StreamWriter logline = outtxt.AppendText(); 


     logline.WriteLine("Test Case : " + testcasenum); 
     logline.WriteLine("{0},{1},{2}", "Expected - "+Expected, "Actual - "+Actual, "Result - "+textResult); 

     // flush and close file. 

     logline.Flush(); logline.Close(); 


    } 
} 

uripathTestContext.TestDeploymentDirのと同じパスが含まれます:以下は私が書いたコードです。今度はResults.txtが添付ファイルとしてTest Explorerに来るでしょう。私たちは出力を見ることができます。

関連する問題