1

Любить гибкость, внедряя поставщика членства, но я почесываю голову, пытаясь пройти тесты интеграции. Моя версия веб-приложения внедряет поставщика членства без проблем на моем уровне обслуживания, но я не могу настроить его/правильно настроить в своей версии приложения для тестирования модулей/интеграции. Вот как я настроен для поставщика членства.Тестирование Spring.NET Injected Memberhip Provider

App.config:

<configuration> 

    <configSections> 
    <sectionGroup name="spring"> 
     <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 
    </sectionGroup> 
    </configSections> 

    <spring> 
    <context> 
     <resource uri="assembly://App.UI/App.UI/auth-config.xml"/> 
     <resource uri="assembly://App.UI/App.UI/core-config.xml"/> 
    </context> 
    </spring> 

    <connectionStrings> 
    <add name="ApplicationServices" providerName="System.Data.SqlClient" 
     connectionString="server=localhost;database=aspnetdb;User ID=AppWebUser;[email protected]" /> 
    <add name="appDb" providerName="System.Data.SqlClient" 
     connectionString="server=localhost;database=app;Persist Security Info=False;User ID=AppWebUser;[email protected]"/> 
    <add name="test_appDb" providerName="System.Data.SqlClient" 
       connectionString="server=localhost;database=app_test;Persist Security Info=False;User ID=AppWebUser;[email protected]"/> 
    </connectionStrings> 

    <system.web> 
    <membership defaultProvider="AppSqlMembershipProvider"> 
     <providers> 
     <clear/> 
     <add connectionStringName="" name="AppSqlMembershipProvider" type="Spring.Web.Providers.MembershipProviderAdapter, Spring.Web" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="false" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="5" 
      minRequiredPasswordLength="7" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression=""/> 
     </providers> 
    </membership> 

    <roleManager enabled="true" defaultProvider="AppSqlRoleProvider"> 
     <providers> 
     <clear/> 
     <add connectionStringName="" name="AppSqlRoleProvider" type="Spring.Web.Providers.RoleProviderAdapter, Spring.Web"/> 
     </providers> 
    </roleManager> 

    <profile defaultProvider="AppSqlProfileProvider"> 
     <providers> 
     <clear/> 
     <add name="AppSqlProfileProvider" type="Spring.Web.Providers.ProfileProviderAdapter, Spring.Web" connectionStringName=""/> 
     </providers> 
     <properties> 
     <add name="Greeting" type="String"/> 
     </properties> 
    </profile> 
    </system.web> 

</configuration> 

Auth-config.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net"> 

    <object id="AppSqlMembershipProvider" type="Spring.Web.Providers.ConfigurableSqlMembershipProvider"> 
    <property name="connectionStringName" value="ApplicationServices" /> 
    <property name="parameters"> 
     <name-values> 
     <add key="description" value="membershipprovider description" /> 
     </name-values> 
    </property> 
    </object> 

    <object id="AppSqlRoleProvider" type="Spring.Web.Providers.ConfigurableSqlRoleProvider"> 
    <property name="connectionStringName" value="ApplicationServices" /> 
    <property name="parameters"> 
     <name-values> 
     <add key="description" value="roleprovider description" /> 
     </name-values> 
    </property> 
    </object> 

    <object id="AppSqlProfileProvider" type="Spring.Web.Providers.ConfigurableSqlProfileProvider"> 
    <property name="connectionStringName" value="ApplicationServices" /> 
    <property name="parameters"> 
     <name-values> 
     <add key="description" value="profileprovider description" /> 
     </name-values> 
    </property> 
    </object> 

</objects> 

Мой MembershipProvider настроен в ядро-config.xml:

<object id="AccountMembershipService" type="App.Core.Services.AccountMembershipService, App.Core.Services" > 
    <constructor-arg name="provider" ref="AppSqlMembershipProvider"/>  <!-- see auth-config.xml for membership provider --> 
</object> 

Как я уже говорил ранее , Я могу ввести Service никаких проблем в моем веб-приложении, но я не могу получить мой тест на работу co rrectly:

[TestFixture] 
public class AccountMembershipServiceTest 
{ 
    protected IMembershipService AccountMembershipService { get; set; } // properyt injected 
    [Test] 
    public void SanityCheck() 
    { 
     Assert.IsNotNull(this.AccountMembershipService);    
    }   
} 

Но, увы .... провал:

------ Test started: Assembly: App.Tests.dll ------ 

Test 'App.Tests.IntegrationTesting.AccountMembershipServiceTest.SanityCheck' failed: 
    Expected: not null 
    But was: null 
    Integration\AccountMembershipServiceTest.cs(23,0): at App.Tests.IntegrationTesting.AccountMembershipServiceTest.SanityCheck() 

0 passed, 1 failed, 0 skipped, took 1.80 seconds (NUnit 2.5.5). 

Кто-нибудь еще с той же проблемой или решал это, а также с Spring.NET?

ПРИМЕЧАНИЕ. Все мои сконфигурированные объекты в моем приложении для тестирования модулей/интеграции работают, только мой членский провайдер является проблематичным.

ответ

2

Я думаю, что проблема заключается в вашем тестовом коде, а не в конфигурации членства или конфигурации контекста Spring.NET.

Чтобы использовать Spring.NET dependency injected tests, ваш тест

  • должны наследоваться от одного из базовых классов тестов Spring.NET
  • должны иметь общие свойства впрыснуть (используя по умолчанию автоматический провод с по типу) - если ваша собственность защищена, это будет нулевым, и вы получите сбойный TestResult из вашего вопроса
  • следует указать расположение конфигурационного

например:

[TestFixture] 
public class AccountMembershipServiceTest : 
      AbstractDependencyInjectionSpringContextTests 
{ 
    // public properties will be auto-wired by type: 
    public IMembershipService AccountMembershipService { get; set; } 

    protected override string[] ConfigLocations { ... } 
} 

Если вы хотите к use protected fields for your dependencies, то вы должны использовать защищенные поля, а не свойство и установить PopulateProtectedVariables = true в тестовом конструкторе:

[TestFixture] 
public class AccountMembershipServiceTest : 
      AbstractDependencyInjectionSpringContextTests 
{ 
    public AccountMembershipServiceTest() 
    { 
     PopulateProtectedVariables = true; 
    } 

    // protected fields will be looked up in the container by field name: 
    protected IMembershipService AccountMembershipService; 


    protected override string[] ConfigLocations { ... } 
} 

Я подозреваю, что ваша конфигурация членства на самом деле правильно:

+0

ссылка: https://github.com/serra/stackoverflow/blob/master/spring-questions/q8981997_membership_provider_in_unit_test/Program.cs – Marijn

+0

Возможно, я спрятал слишком много деталей в своем тесте. Мой «AccountMembershipServiceTest» наследует от другого класса, который наследуется от «AbstractTransactionalDbProviderSpringContextTests». Я попробовал «AbstractDependencyInjectionSpringContextTests » и «AbstractSpringContextTests» .... до сих пор нет кубиков. Я вижу, что объекты настроены, но это не инъекция. В эти выходные я собираюсь совершить глубокое погружение. –

+1

Не уверен, почему я заставлял защищаться там. Сделал их публичными и установил автоматический провод для автоматического обнаружения. –

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