2011-07-01 2 views
3

클라이언트에서 파일을 업로드 할 때 인 파일 (HttpFileCollectionBase)을 찾을 수 있습니다.통합 테스트에서 엔드 포인트로 파일을 업로드하는 방법

에는 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 

, 차라리 메모리 스트림을 사용합니다 파일이지만 파일 스트림은 동일하게 작동합니다.

모방을 피하고 이러한 의존성을 모두 설정하지 않으려면 abstraction을 UploadedFiles 추상화하고 코드를 추상화에 종속되게하고 UploadedFiles만을 모의 공격 할 수 있습니다. 파일 스트림을 이름으로 (또는 사용자가 액세스하여) 가져 오려면 Request.Files 주위의 얇은 래퍼 여야합니다. 다운 스트림 코드가 이제 HttpRequestBase, HttpFileCollectionBase, HttpPostedFileBase, Streamstring이 아닌 UploadedFiles, Streamstring에 의존하기 때문에 더 좋습니다.

설정 사항은 다음과 같이 단순화 될 것이다 : 그것이 작동하는 것처럼

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

덕분에,이 보인다. 나는 그것을 발사 할 것이다! – Samo

관련 문제