2011-07-01 13 views
3

ファイルがクライアントからアップロードされると、ファイルはのthis.Request.Filesにあります。統合テストからファイルをエンドポイントにアップロードする方法

には、HttpPostedFileBaseが含まれます。

これらのオブジェクトのプロパティは読み取り専用であるため、いくつかのモックをセットアップできることを期待していました。私のモックリクエストはモックHttpFileCollectionを返し、コレクションにはモックHttpPostedFileが含まれます。そのオブジェクトのInputStreamプロパティは、FileStreamオブジェクトを返します。このオブジェクトは、ソースコントロール内の実際のファイルを使用してインスタンス化します。

  1. これは 統合テストからエンドポイントに ファイルをアップロードするには良いアプローチですか?
  2. 良いアプローチの場合は、 をMoqと偽装するにはどうすればよいですか?
  3. これは良いアプローチではない場合は、より良い方法を提案できますか?

ありがとう!

答えて

4

私はasp.netのMVCについて何も知らないが、それはあなたがあなたのモックの依存関係のセットアップには、このような何かをする必要がありますように見えます:ユニットテストで

MemoryStream stream = new MemoryStream(); 

var mockFile = new Mock<HttpPostedFileBase>(); 
var mockFiles = new Mock<HttpFileCollectionBase>(); 
var mockRequest = new Mock<HttpRequestBase>(); 

mockFile.Setup(f => f.InputStream).Returns(stream); 

// if for example, you index the file by name. 
mockFiles.Setup(f => f[It.IsAny<string>()]).Returns(mockFile.Object); 

mockRequest.Setup(r => r.Files).Returns(() => mockFiles.Object); 

// write expected data to your memory stream, then instantiate your class 
// under test using the mockRequest.Object 

、私はむしろ、メモリストリームを使用しますファイルですが、ファイルストリームは同じように動作します。

これらの依存関係を模擬して設定する必要がないようにするには、抽象度がUploadedFilesであり、コードが抽象度に依存するようにしてください。UploadedFilesのみをモックしてください。これは、ファイルストリームを名前で(またはアクセスして)取得するには、Request.Filesのまわりの薄いラッパーである必要があります。ダウンストリームコードがHttpRequestBase,HttpFileCollectionBase,HttpPostedFileBase,およびstringではなく、UploadedFiles,Streamおよびstringに依存するので、これはより良好である。

セットアップは、このような何かに単純化することになります。

MemoryStream stream = new MemoryStream(); 
var mockUploadedFiles = new Mock<UploadedFiles>(); 
mockUploadedFiles.Setup(u => u.GetFile(It.IsAny<string>())).Returns(stream); 
+0

おかげで、それがうまくいくように、これが見えます。私はそれを与えるだろう! – Samo

関連する問題