문제

ASP.NET MVC에 업로드 된 파일을 처리하는 컨트롤러 작업이 있습니다. 그러나 전화 할 방법이없는 것 같습니다. Request.Files.Count mvccontrib를 사용하는 동안 TestControllerBuilder.

나는 추상화로 이것을 해결할 수 있다는 것을 알고 있습니다 Request.Files. 내 질문은 다음과 같습니다.

  1. 실제로 전화 할 수있는 직접적인 방법이없는 경우 Request.Files.Count 사용할 때 TestControllerBuilder? 아니면 내가 뭔가 잘못하고 있습니까?
  2. 호출을 스텁하는 방법이 있습니까? Request.Files.Count 사용하는 동안 TestControllerBuilder 코뿔소 모의 사용?
  3. 내가 취급 요청이나 패치를 제출해야한다고 생각하십니까? Request.Files.Count mvccontrib에?

예제 코드 :

나는 적어도 하나의 파일이 있는지 확인하고 싶습니다. Request.Files 내 행동에 다음과 같은 조건부가 있습니다.

public class MyController : Controller {
    public ActionResult Upload() {
        if (Request.Files == null || Request.Files.Count == 0)
            ViewData.ModelState.AddModelError("File", "Please upload a file");
        // do stuff
        return View();
    }
}

나는 그것을 사용하고있다 TestControllerBuilder MVCContrib에서 컨트롤러 테스트에 대한 테스트를 두 배로 만듭니다. 그러나 전화 Request.Files.Count 항상 예외를 던지는 것 같습니다. 예를 들어 다음 Nunit 테스트를 실행하는 경우 a NotImplementedException 전화하는 동안 controller.Upload() 전화로 Request.Files.Count:

[Test]
public void Upload_should_return_default_view_given_one_file() {
    MyController controller = new MyController();
    TestControllerBuilder controllerBuilder = new TestControllerBuilder();
    controllerBuilder.InitializeController(controller);
    controllerBuilder.Files["file"] = 
        MockRepository.GenerateStub<HttpPostedFileBase>();

    var result = controller.Upload() as ViewResult;

    Assert.That(result.ViewData.ModelState.IsValid, Is.True);
    result.AssertViewRendered().ForView(string.Empty);
}

나는 또한 전화를 스터브하려고 시도했다 Request.Files.Count 아무 소용이 없다 (나는 Rhino Mocks를 사용하고있다). 아래 작업 중 어느 것도 (내가 변경하더라도 controller 및/또는 controllerBuilder 스터브에) :

controllerBuilder.Stub(cb => cb.HttpContext.Request.Files.Count).Return(1);
controller.Stub(c => c.Request.Files.Count).Return(1);

감사

도움이 되었습니까?

해결책

I submitted a patch on Github to MvcContrib mantainers, but the changes are very simple to make, the problem is that HttpFileCollectionBase is not implementing Count() and this[int index] methods so they must be overriden by the WriteableHttpFileCollection in MvcContrib.

I paste the code here for completeness, that must be added to WriteableHttpFileCollection class:

public override HttpPostedFileBase this[int index]
{
    get { return files[AllKeys[index]]; }
}

public override int Count
{
    get { return files.Count; }
}

다른 팁

I've used this approach to solve the problem.

SetUp the test: string fileName = "Test 1.pdf"; FileStream stream = File.OpenRead("log4net.config"); MockRepository mock = new MockRepository();

        builder.Files[fileName] = mock.CreateMock<HttpPostedFileBase>();
        using (mock.Record())
        {
            Expect.Call(builder.Files[fileName].FileName)
                  .Return(fileName);
            Expect.Call(builder.Files[fileName].ContentType)
                  .Return(contentType);
            Expect.Call(builder.Files[fileName].ContentLength)
                  .Return(Convert.ToInt32(stream.Length.ToString()));
            Expect.Call(builder.Files[fileName].InputStream)
                  .Return(stream);
        }

using the mock:

        foreach(string key in Request.Files.AllKeys)
        {
            int lenght = Request.Files[key].ContentLength;
            if (lenght > 0)
            {
                Document document = new Document();
                string fileName = Request.Files[key].FileName;
                byte[] content= new byte[Convert.ToInt32(lenght)];
                Request.Files[key].InputStream.Read(content, 0, content.Length);
                document.SetContent(content);
                document.MimeType = Request.Files[key].ContentType;
                // do whatever you want...
            }
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top