2014-09-14 3 views
3

Я использовал Autofac в качестве своего контейнера DI вместо TinyIoC, который по умолчанию используется в Nancy.Функциональное тестирование NancyFX с Autofac

У меня работает API, и я могу легко подключиться к нему через браузер, однако мои функциональные тесты не работают. Они терпят неудачу, потому что я пытаюсь использовать Nancy Browser для установки тестов, но для этого требуется TinyIoC Container (которого нет).

Есть ли простой способ расширить/переопределить браузер, чтобы взять контейнер Autofac вместо TinyIoC? Альтернативно (и, вероятно, лучше), существует ли Nancy.Testing Browser, который «может» использовать другой контейнер?

SetUp: System.InvalidOperationException: Что-то пошло не так, когда пытаясь удовлетворить одну из зависимостей во время композиции, сделать убедитесь, что вы зарегистрировали всю новую зависимость в контейнере и осмотреть InnerException для более подробной информации. ----> Nancy.TinyIoc.TinyIoCResolutionException: Не удалось разрешить тип: Nancy.NancyEngine ----> Nancy.TinyIoc.TinyIoCResolutionException: Не удалось разрешить тип: Nancy.Routing.DefaultRequestDispatcher ----> Nancy .TinyIoc.TinyIoCResolutionException: Не удалось разрешить тип: Nancy.Routing.DefaultRouteResolver ----> Nancy.TinyIoc.TinyIoCResolutionException: Не удается разрешить тип: Nancy.Routing.RouteCache ----> Nancy.TinyIoc.TinyIoCResolutionException : Не удается решить тип: TimeTracker.Web.Api.UserModule ----> Nancy.TinyIoc.TinyIoCResolutionException: Не удается решить тип: TimeTracker.Services.IUserService

Как вы можете видеть, TinyIoC не может разрешить IUserService.

Nancy.TinyIoc.TinyIoCResolutionException: Не удалось разрешить тип: TimeTracker.Services.IUserService

Это потому, что я не регистрации НИЧЕГО с TinyIoC ... Вместо того, чтобы я его регистрацию Autofac.

[TestFixtureSetUp] 
    public void Setup() 
    { 
     _browser = new Browser(with => 
      { 
       with.Module<UserModule>(); 

       // forcing me to use TinyIoCContainer 
       with.ApplicationStartup((x, pipelines) => 
        { 
         var container = BootStrapper.ConfigureContainer(new ContainerBuilder().Build()); 

         var userValidator = container.Resolve<IUserValidator>(); 
         var basicAuthConfig = new BasicAuthenticationConfiguration(userValidator, "TimeTra.ca"); 
         pipelines.EnableBasicAuthentication(basicAuthConfig); 

         pipelines.OnError.AddItemToEndOfPipeline(
          (context, exception) => CustomErrorResponse.FromException(exception)); 

         // Setup a clean database 
         var migrationRunner = new MigrationRunner(container.Resolve<IDbProvider>()); 
         migrationRunner.DropDatabase(); 
         migrationRunner.CreateDatabase(); 

         BootStrapper.RunMigrations(container); 
         SeedData.SetupFixtureDataInDatabase(container.Resolve<IServiceLocator>()); 
        }); 
      }); 
    } 

    private Browser _browser; 
+1

Кажется, что IUserService отсутствует. Вы пробовали использовать IUserService с помощью .Dependency? –

+0

@ChristianHorsdal, к сожалению, не имеет к этому никакого отношения. Это факт, что я не использую контейнер по умолчанию, который хочет Нэнси. –

+0

Откуда вы это знаете? - Мне это не кажется, из того, что вы разместили в вопросе. –

ответ

2

Если вы хотите использовать Autofac загрузчик при тестировании вам необходимо использовать Browser(INancyBootstrapper bootstrapper, Action<BrowserContext> defaults = null) конструктор и явно указать экземпляр вашего загрузчике.

Проблема с этим подходом заключается в том, что вам будет трудно «заменить» компоненты для целей тестирования, то есть использовать mocks и т. Д., Поэтому существует ConfigurableBootstrapper. Я также не совсем уверен, как это повлияет на обнаружение модулей. С помощью ConfigurableBootstrapper вы явно указываете, какие модули вы хотите использовать вместе с другими службами.

+0

А это имеет смысл. Я уже слишком усложнял это. 'var bootstrapper = new BootStrapper(); _browser = новый браузер (bootstrapper); ' –

+1

ok, поэтому после тестирования этого подхода мой API всегда бросает 404. Я не врывался в отладчик, чтобы понять, почему ... –

Смежные вопросы