1

アップロードされたファイルを処理するコントローラーアクションがASP.NETMVCにあります。Request.Files.Countただし、 MvcContribを使用しているときに呼び出す方法はないようTestControllerBuilderです。

抽象化することでこれを回避できることを私は知っていますRequest.Files。私の質問は次のとおりです。

  1. Request.Files.Count使用時に直接呼び出す方法がないのは確かTestControllerBuilderですか?それとも私は何か間違ったことをしていますか?
  2. Rhino Mocksの使用Request.Files.Count中に呼び出しをスタブ化する方法はありますか?TestControllerBuilder
  3. Request.Files.CountMvcContribに処理のリクエストまたはパッチを送信する必要があると思いますか?

コード例:

コレクションに少なくとも1つのファイルがあることを確認したい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();
    }
}

from MvcContribを使用しTestControllerBuilderて、コントローラーテスト用のテストダブルを作成しています。ただし、への呼び出しはRequest.Files.Count常に例外をスローするようです。たとえば、次のNUnitテストを実行するNotImplementedExceptionと、tocontroller.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);

ありがとう

4

2 に答える 2

1

GithubのパッチをMvcContribマンテナーに送信しましたが、変更は非常に簡単です。問題は、HttpFileCollectionBaseがCount()メソッドとthis [int index]メソッドを実装していないため、MvcContribのWriteableHttpFileCollectionでオーバーライドする必要があることです。

完全を期すためにここにコードを貼り付けます。これは、WriteableHttpFileCollectionクラスに追加する必要があります。

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

public override int Count
{
    get { return files.Count; }
}
于 2010-01-27T14:35:23.997 に答える
0

私はこのアプローチを使用して問題を解決しました。

テストを設定します。stringfileName="Test 1.pdf"; FileStreamストリーム=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);
        }

モックを使用する:

        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...
            }
        }
于 2009-10-07T19:23:11.023 に答える