[ExpectedException(typeof(anexceptionBaseExcepion))] -- c# フィールド と mstest フィールド 関連 問題

[ExpectedException(typeof(AnExceptionBaseException))]












3
vote

問題

日本語

throw 99887662 または<コード>または<コード>または<コード>、または AnotherException の両方には、単体テストを書きました。コード>。その後、基本例外に ExpectedExceptionAttribute を追加しました。

テスト名:call_should_throw_if_device_is_not_ready test

...

結果メッセージ:テスト方法 DiskManagementTests.DiskFreespaceTests.call_should_throw_if_device_is_not_ready. Exception System.IO.FileNotFoundExceptionを投げましたが、例外 System.IO.IOExceptionが予想されました。例外メッセージ: System.IO.FileNotFoundException:デバイスは準備ができていません。 (例外 Hresultから:0x80070015)

これは、この特定の場合では、例外がHRESULT戻りコードから発生するため、妥当な設計決定のようです。それはどの例外が投げられるかを決定することがほとんど不可能になります。テストが想定されているユニットからコードロジックをコピーせずに少なくとも行わないでください...テスト

私のコード(私はこれが<コード> FileNotFound または<コード>または<コード> DirectoryNotFound を投げることができると思います):

<事前> <コード> [TestMethod] [ExpectedException(typeof(IOException))] public void Call_Should_Throw_If_Device_Is_Not_Ready() { foreach (DriveInfo drive in DriveInfo.GetDrives().Where(drive => !drive.IsReady)) { DiskFreeSpace diskFreeSpace = DiskManagement.GetDiskFreeSpace(drive.RootDirectory.FullName); Assert.Fail("API call did not fail even though the drive reports that it is not ready."); } Assert.Inconclusive("All drives were ready. Try testing with an empty disc drive."); }

単体テストの書き込み方法を再考する必要がありますか?

編集

このシナリオは結局のところサポートされています。本当にそれが本当に登録されたのは AllowDerivedTypes にtrueに設定されました。

<事前> <コード> #include <stdio.h> #include <stdlib.h> #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> SDL_Texture* loadTexStreaming(const char* imgName, SDL_Renderer* renderer) { SDL_Surface* image = IMG_Load(imgName); SDL_Texture* tex = SDL_CreateTexture(renderer, image->format->format, SDL_TEXTUREACCESS_STREAMING, image->w, image->h); void* pixels = NULL; int pitch = 0; SDL_LockTexture(tex, NULL, &pixels, &pitch); memcpy(pixels, image->pixels, image->pitch * image->h); SDL_UnlockTexture(tex); SDL_FreeSurface(image); return tex; } int main(int argc, char** argv) { (void)argc; (void)argv; SDL_Init(SDL_INIT_EVERYTHING); SDL_Window* window = SDL_CreateWindow("TexTest", 100, 100, 200, 200, 0); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_Texture* texture = loadTexStreaming("img.png", renderer); SDL_Rect rect = {0, 0, 64, 64}; int running = 1; SDL_Event e; while(running) { while(SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { running = 0; } } SDL_RenderCopy(renderer, texture, NULL, &rect); SDL_RenderPresent(renderer); } SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return EXIT_SUCCESS; } 0
英語

I wrote a unit test in such a way that it should throw AnException or AnotherException, both deriving from AnExceptionBaseException. I then proceeded to add an ExpectedExceptionAttribute for the base exception, only to find that my test will still be marked as failed.

Test Name: Call_Should_Throw_If_Device_Is_Not_Ready Test

...

Result Message: Test method DiskManagementTests.DiskFreeSpaceTests.Call_Should_Throw_If_Device_Is_Not_Ready threw exception System.IO.FileNotFoundException, but exception System.IO.IOException was expected. Exception message: System.IO.FileNotFoundException: The device is not ready. (Exception from HRESULT: 0x80070015)

This seems like a reasonable design decision because, in this particular case, the exception is generated from an HRESULT return code. That makes it nearly impossible to determine which exception will be thrown. At least not without copying the code logic from the unit that my test is supposed to ...test.

My code (I believe this can throw either FileNotFound or DirectoryNotFound):

[TestMethod] [ExpectedException(typeof(IOException))] public void Call_Should_Throw_If_Device_Is_Not_Ready() {     foreach (DriveInfo drive in DriveInfo.GetDrives().Where(drive => !drive.IsReady))     {         DiskFreeSpace diskFreeSpace = DiskManagement.GetDiskFreeSpace(drive.RootDirectory.FullName);         Assert.Fail("API call did not fail even though the drive reports that it is not ready.");     }     Assert.Inconclusive("All drives were ready. Try testing with an empty disc drive."); } 

Do I need to reconsider the way I write unit tests?

EDIT

This scenario is supported after all. All it really took was setting AllowDerivedTypes to true.

[TestMethod] [ExpectedException(typeof(IOException), AllowDerivedTypes = true)] public void Call_Should_Throw_If_Device_Is_Not_Ready() {     // ... } 
</div
     
     
     

回答リスト

1
 
vote
vote
ベストアンサー
 

スローされた例外が属性で定義された例外を継承するかどうかを確認する独自の ExpectedException 属性を作成できます。

<事前> <コード> public sealed class MyExpectedException : ExpectedExceptionBaseAttribute { private Type _expectedExceptionBaseType; public MyExpectedException(Type expectedExceptionType) { _expectedExceptionBaseType = expectedExceptionType; } protected override void Verify(Exception exception) { Assert.IsNotNull(exception); Assert.IsTrue(exception.GetType().IsInstanceOfType(typeof(_expectedExceptionBaseType)) || exception.GetType().IsSubclassOf(typeof(_expectedExceptionBaseType))); } }

と属性をテストに変更します。

<事前> <コード> [MyExpectedException(typeof(IOException))]
 

You can create your own ExpectedException attribute that will check if the thrown exception inherites the Exception defined in the attribute.

public sealed class MyExpectedException : ExpectedExceptionBaseAttribute {     private Type _expectedExceptionBaseType;      public MyExpectedException(Type expectedExceptionType)     {         _expectedExceptionBaseType = expectedExceptionType;     }      protected override void Verify(Exception exception)     {         Assert.IsNotNull(exception);         Assert.IsTrue(exception.GetType().IsInstanceOfType(typeof(_expectedExceptionBaseType)) ||                        exception.GetType().IsSubclassOf(typeof(_expectedExceptionBaseType)));     } } 

and change the attribute to your test:

[MyExpectedException(typeof(IOException))] 
</div
 
 
       
       

関連する質問

8  テスト結果を取得し、MSTESTからHTMLレポートをカバレッジする方法はありますか  ( Is there a way to get a test results and coverage html report from mstest ) 
MSTESTが作成した Results.trx data.coverage ファイルからHTMLベースのレポートを作成できたいと思います。理想的にはこれは障害を一覧表示し、いくつかの基本的なカバレッジ統計を表示します。 これを行うツールを誰かに知っていま...

4  エンティティフレームワーク2011 CTPおよびユニットテストプロジェクト  ( Entity framework june 2011 ctp and unit test project ) 
2011年6月CTPにアップグレードしたばかりのMVC / EFプロジェクトを持っています。 Webプロジェクトは非常に機能していますが、問題は、それが新しいフレームワークをターゲットにしているようにMSUnitプロジェクトからそれを参照できなくなりました。...

2  CollectionAssert(およびLINQ?)を使用する方法1つのプロパティのすべての値を見つけるには同じですか?  ( How to use collectionassert and linq to find all the values for one property ) 
これは、今日に尋ねた....テストコレクション(私は知らない)を助けるためのCollectionAssertの使用を強調しました。 ICollection<Foo> foos; には、ステータスと呼ばれるプロパティがあります..を簡単にするために、intま...

0  TFS 2013ビルド:複数のビルドエージェントで並行してユニットテストを実行する  ( Tfs 2013 build running unit tests in parallel on multiple build agents ) 
私のMSTest単位テストを実行しているXAMLビルド定義を持っていて、それらすべてを実行するのに長い時間がかかります。ビルド環境では、4つのビルドエージェント(各コア付きのVMが1つのコア付き)セットアップがあります。 Microsoft.teamFound...

2  播種リポジトリ・リノモック  ( Seeding repository rhino mocks ) 
私はC#のテスト主導開発の最初の旅行に着手しています。起動するには、MSTestと rhino.mocks 。私は私の ICustomerRepository に対して私の最初の単体テストを書いています。各テスト方法については、 Customer を新たに注意...

1  MSTESTSでは、いかなる例外も捉えることが可能ですか?  ( In mstests is it possible to catch any exception ) 
脆性試験を避けようとしています。無効なデータが渡されたときにメソッドが例外をスローすることをアサートしたいと思います。 string.isnulloremptyを使用するたとえば、文字列が空の場合はNullReference Exceptionを正しくスロー...

0  どのように私は、その実行の前に、私のユニットテストの名前を確認できますか?  ( How can i determine the name of my unit test before its execution ) 
私はMSTestをを使用していたし、すべてが大丈夫でした。少し前、私はユニットテストをデータ駆動型の大規模な番号を記入する必要がありました。 また、私は私が(外部リモートサービスからフェッチされた)正しいパラメータを指定してデータソースを取り込むことができるよ...

4  部分的なバインディング情報はアセンブリMSTESTに供給されました  ( Partial binding information was supplied for an assembly mstest ) 
.NETの新しい<コード> SimpleMembership フレームワークを使用しています。 ユーザを作成するための単位テスト(下記参照)は、Visual Studio 2012 IDEでローカルに機能します。 <コード> WebSecurity.Cr...

4  Visual Studio 2017のテスト用の単一サーバーインスタンスを実行&共有する  ( Run share a single server instance for tests in visual studio 2017 ) 
My Visual Studio 2017プロジェクトには、いくつかの単位テストプロジェクトが含まれています。これらすべてのテストは、1つのASP.Netコアサーバーに対して実行されます。すべてのテストの前にASP.NETコアサーバを開始し、すべてのテストの...

4  System.Net.WebExceptionに接続できないSelenium WebDriverテストは失敗します  ( Selenium webdriver tests fail with system net webexception unable to connect ) 
MSTESTへのコマンドライン呼び出しによって実行されているSelenium WebDriver(Selenium RCではなく、Seleniumサーバーを使用していない)テストに取り組んでいます。テストを計画している各ブラウザのテストクラスに分割され、各テ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有