2011-07-18 3 views
4

HttpFileCollectionBase 인스턴스의 Count 속성을 조롱하려고하지만 어떻게 든 작동하지 않습니다.HttpFileCollectionBase : Mocking Count-Property

var fakedRequest = new Mock<HttpRequestBase>(); 
var fakedFile = new Mock<HttpPostedFileBase>(); 
fakedFile.SetupGet(x => x.InputStream).Returns(inputStream); 
var fakedFileCollection = new Mock<HttpFileCollectionBase>(); 
fakedFileCollection.SetupGet(x => x.Count).Returns(1); 
fakedRequest.SetupGet(x => x.Files).Returns(fakedFileCollection.Object); 
fakedRequest.SetupGet(x => x.Files[0]).Returns(fakedFile.Object); 

var sut = new TestableExploreController(null, fakedTemporaryStorageRepository.Object) 
    { 
     HttpRequest = fakedRequest.Object 
    }; 

내가 알기로 나는 테스트중인 시스템에 주입하는 조롱 된 HttpRequest를 만듭니다. Count 속성은 1을 반환하도록 정의되어 있지만 항상 0을 반환합니다. Moq을 사용하고 있습니다.

내가 뭘 잘못하고 있니?

답변

10

Scott Hanselman blogged about this.

fakedRequest.SetupGet(x => x.Files[0]).Returns(fakedFile.Object); 

이 같은 시도하고 작동합니다 :이 문제는 다음과 같은 라인

var fakedRequest = new Mock<HttpRequestBase>(); 
var fakedFile = new Mock<HttpPostedFileBase>(); 
fakedFile.SetupGet(x => x.InputStream).Returns(inputStream); 
var fakedFileCollection = new Mock<HttpFileCollectionBase>(); 
fakedFileCollection.SetupGet(x => x.Count).Returns(1); 
fakedFileCollection.SetupGet(x => x[0]).Returns(fakedFile.Object); 
fakedRequest.SetupGet(x => x.Files).Returns(fakedFileCollection.Object); 
0

다음은 파일 모으기를 통해 foreach는 할 수 NSubstitute를 사용하여 깊은 예제

var request = Substitute.For<HttpRequestBase>(); 

var firstFile = Substitute.For<HttpPostedFileBase>(); 
firstFile.ContentLength.Returns(1); 
firstFile.FileName.Returns("firstFile.txt"); 
firstFile.ContentType.Returns("text"); 
firstFile.InputStream.Returns(new MemoryStream()); 

var secondFile = Substitute.For<HttpPostedFileBase>(); 
secondFile.ContentLength.Returns(1); 
secondFile.FileName.Returns("secondFile.txt"); 
secondFile.ContentType.Returns("text"); 
secondFile.InputStream.Returns(new MemoryStream()); 

var fileKeys = new[] { "1", "2" }; 

var files = Substitute.For<HttpFileCollectionBase>(); 
files.GetEnumerator().Returns(fileKeys.GetEnumerator()); 

files[fileKeys[0]].Returns(firstFile); 
files[fileKeys[1]].Returns(secondFile); 

request.Files.Returns(files); 

발신자 예 사용 예 https://stackoverflow.com/a/1760523/37055

관련 문제