Юнит-тестирование OpenRasta - PullRequest
       8

Юнит-тестирование OpenRasta

4 голосов
/ 21 октября 2010

Я собираюсь начать работу над проектом OpenRasta (веб-сервис xml over http).OpenRasta выглядит великолепно, но, к сожалению, отработанные примеры кажутся немногочисленными в Интернете.Если посмотреть на тестовую сторону проекта, если мои обработчики возвращают строго типизированные объекты (не OperationResult), то есть:

public class PersonHandler
...
 public Person Get(int id)
 {
 ...

Как я могу проверить коды состояния http?(Например, если обработчик выдает необработанное исключение).Я не уверен, на каком уровне тесты участвуют, и что требует насмешек (используя moq btw)

Любая помощь приветствуется, особенно кодированные примеры!

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Обработчик - это просто класс - в идеале с минимальными зависимостями - поэтому ваши модульные тесты могут просто проверить изолированную логику в классе.

Если вы хотите проверить коды состояния, я рекомендую (основываясь на очень небольшом опыте!) Использовать OpenRasta self-hosting.

Вот тест (несколько измененный), который я недавно написал:

    [TestMethod]
    public void POST_with_inaccurate_contentLength_returns_405()
    {
        var resource = GetResource();

        IRequest request = new InMemoryRequest
        {
            HttpMethod = "POST",
            Uri = new Uri("http://localhost/Resource"),
        };
        request.Headers.ContentLength = 16;  //wrong!

        request.Entity.Stream.Write(resource.Content, 0, resource.Content.Length);

        var response = _host.ProcessRequest(request);

        Assert.AreEqual(405, response.StatusCode);
    }

Я должен добавить, что хост настроен в методе TestInitialize следующим образом:

        _host = new InMemoryHost(new Configuration());
        _host.Resolver.AddDependencyInstance(typeof(IFileResourceRepository), _repository, DependencyLifetime.Singleton);

... и очищается в методе TestCleanup.

1 голос
/ 26 октября 2010

Я столкнулся с той же проблемой и закончил тем, что написал свои тесты как интеграционные тесты на гораздо более высоком уровне, фактически делая реальные вызовы REST / HTTP через простой клиент HttpWebRequest. Это позволило мне проверить заголовки HTTP-ответов / коды состояния и дважды проверить сериализацию JSON / XML с точки зрения клиента, что было столь же важно, как и то, успешно ли выполнялись операции.

Я начал с того, что возвратил OperationResult из всех моих обработчиков и использовал их для обёртывания строго типизированных объектов. Все мои обработчики наследуются от базового класса с несколькими вспомогательными методами, которые облегчают возвращение пользовательской ошибки с удобным сообщением об ошибке. Чем больше я это кодировал, тем больше мои обработчики напоминали контроллер ASP.NET MVC. e.g.:

    public OperationResult GetById(int id)
    {
        try
        {
            // do stuff here
            return OKResult( // some strongly-typed resource );
        }
        catch(SomeException ex)
        {
            return BadRequestResult(SomeErrorCode, ex.Message);
        }
    }

Тогда в тестовом клиенте довольно просто проверить код состояния HTTP. Очевидно, это не очень помогает с насмешками. Я не уверен, что является лучшим решением, на самом деле я одобрил этот вопрос в надежде, что кто-то ответит на него лучше, чем я, - но до сих пор мне это удавалось.

...