Pergunta

Eu tenho uma ação do controlador no ASP.NET MVC que lida com arquivos enviados. No entanto, parece que não há como ligar Request.Files.Count Ao usar o MVCContrib's TestControllerBuilder.

Eu sei que posso contornar isso abstraindo Request.Files. Minhas perguntas são:

  1. É realmente o caso de não haver maneira direta de ligar Request.Files.Count Ao usar o TestControllerBuilder? Ou estou fazendo algo errado?
  2. Existe uma maneira de arrancar a chamada para Request.Files.Count Enquanto estiver usando TestControllerBuilder Usando zombares de rinoceronte?
  3. Você acha que eu deveria enviar uma solicitação ou patch para manuseio Request.Files.Count para mvcContrib?

Código de exemplo:

Quero ter certeza de que há pelo menos um arquivo no Request.Files coleção, então eu tenho o seguinte condicional em minha ação:

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();
    }
}

Estou usando o TestControllerBuilder do MVCContrib para criar o teste duplo para os meus testes de controlador. No entanto, a chamada para Request.Files.Count Sempre parece fazer uma exceção. Por exemplo, executando o seguinte teste de frequência lança um NotImplementedException Durante a chamada para controller.Upload() na chamada para 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);
}

Eu também tentei arrancar a chamada para Request.Files.Count sem sucesso (estou usando zombarias de rinoceronte). Nenhuma das obras abaixo (mesmo que eu mude controller e/ou controllerBuilder para um stub):

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

Obrigado

Foi útil?

Solução

EU enviou um patch No gitHub para os mantainers do MVCContrib, mas as mudanças são muito simples de fazer, o problema é que o httpfileCollectionBase não está implementando count () e esse [int índice], para que eles devem ser substituídos pela escritos pelo WritableHttpFileCollection no MVCContrib.

Eu colo o código aqui para completar, que deve ser adicionado à classe WritableHttpFileCollection:

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

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

Outras dicas

Eu usei essa abordagem para resolver o problema.

Configure o teste: 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);
        }

Usando a simulação:

        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...
            }
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top