Usando o request.files.count com o testcontrollerbuilder do MVCContrib?
-
05-07-2019 - |
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:
- É realmente o caso de não haver maneira direta de ligar
Request.Files.Count
Ao usar oTestControllerBuilder
? Ou estou fazendo algo errado? - Existe uma maneira de arrancar a chamada para
Request.Files.Count
Enquanto estiver usandoTestControllerBuilder
Usando zombares de rinoceronte? - 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
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...
}
}