MVC Rhino Mocks для запроса. Файлы - PullRequest
0 голосов
/ 08 июля 2011

Я пытаюсь заставить мой контроллер в модульном тесте вернуть фиктивный файл, когда Request.Files[0] называется

Из других постов на этом сайте я собрал:

[TestMethod]
        public void CreateFileInDatabase()
        {
            var repository = new MocRepository();
            var controller = GetController(repository);

            HttpContextBase mockHttpContext = MockRepository.GenerateMock<HttpContextBase>();
            HttpRequestBase mockRequest = MockRepository.GenerateMock<HttpRequestBase>();
            mockHttpContext.Stub(x => x.Request).Return(mockRequest);

            mockRequest.Stub(x => x.HttpMethod).Return("GET");

            var filesMock = MockRepository.GenerateMock<HttpFileCollectionBase>();
            var fileMock = MockRepository.GenerateMock<HttpPostedFileBase>();
            filesMock.Stub(x => x.Count).Return(1);
            mockRequest.Stub(x => x.Files).Return(filesMock);
            var t = mockHttpContext.Request;

            var automobile = new Automobile{ automobileNumber = "1234" };
            controller.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), controller);
            controller.Create(automobile);
        }

Когда я нахожусь в контроллере во время теста и звоню Request.Files я получаю файлыMock great.

Однако я хочу иметь возможность вызвать Request.Files[0] и получить фиктивный файл, который я могу передать в качестве параметра методу.

Раньше я не много издевался, поэтому любая помощь будет признательна!

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Ваш объект filesMock является имитацией, поэтому он не знает, как разрешать файлы [0]. Вам нужно указать, что нужно вернуть, если кто-то запросит первый файл:

filesMock.Stub(x => x[0]).Return(fileMock);

Добавьте указанную выше строку после создания объекта fileMock, и код заработает:)

0 голосов
/ 08 июля 2011

Самый простой способ - добавить абстракцию над Request.Files[0] через интерфейс и объект, который на самом деле вызывает Request.Files[0]

Примечание. На самом деле я не уверен, что тип данных для Request.Files[0], просто используя IFile в качестве примера.

public interface IFileRetriever
{
    IFile GetFile();
}

public class FileRetriever
{
    public IFile GetFile()
    {
        return Request.Files[0];
    }
}

Очевидно, что интерфейс и реальная реализация соответствуют вашему варианту использования, вероятно, это будет не то, что выше ...

Вваш класс, который в данный момент вызывает Request.Files[0], просто принимает IFileRetriever в качестве зависимости, которую легко смоделировать в Rhino Mocks (или в любой фальсифицирующей / фиктивной среде)

...