Тестване на Spring.NET Injected Membership 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;Password=p@ssw0rd" />
    <add name="appDb" providerName="System.Data.SqlClient"
         connectionString="server=localhost;database=app;Persist Security Info=False;User ID=AppWebUser;Password=p@ssw0rd"/>
    <add name="test_appDb" providerName="System.Data.SqlClient"
              connectionString="server=localhost;database=app_test;Persist Security Info=False;User ID=AppWebUser;Password=p@ssw0rd"/>
  </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 е конфигуриран в core-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 без проблем в моето уеб приложение, но изглежда не мога да накарам теста си да работи правилно:

[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?

ЗАБЕЛЕЖКА: Всички мои други конфигурирани обекти в моето приложение за модулно/интеграционно тестване работят, само моят доставчик на членство е проблематичен.




Отговори (1)


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

За да използвате Spring.NET инжектирани тестове за зависимости, вашият тест

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

Например:

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

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

Ако искате да използвате защитени полета за вашите зависимости, тогава трябва да използвате защитени полета, а не свойства и да зададете 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 { ... }
}

Подозирам, че конфигурацията ви за членство всъщност е правилна:

person Marijn    schedule 25.01.2012
comment
справка: github.com/serra/stackoverflow/blob/ master/spring-questions/ - person Marijn; 25.01.2012
comment
Може да скрия твърде много подробности в моя тест. Моят „AccountMembershipServiceTest“ всъщност наследява от друг клас, който наследява от „AbstractTransactionalDbProviderSpringContextTests“. Опитах 'AbstractDependencyInjectionSpringContextTests' и 'AbstractSpringContextTests'... все още няма зарове. Виждам конфигурираните обекти, но не се инжектира. Ще се потопя дълбоко в това през уикенда. - person Will Sams; 27.01.2012
comment
Не съм сигурен защо наложих защита там. Направи ги публични и зададе автоматичен кабел за автоматично откриване. - person Will Sams; 27.01.2012
comment
Страхотно ти се получи. Все пак не съм сигурен защо трябва ръчно да настройвате автоматичен кабел за автоматично откриване. Между другото – в коментарите можете да използвате обратна отметка (``) вместо единична кавичка ('), за да приложите форматиране на кода: „AbstractSpringContextTests“ става AbstractSpringContextTests. Това работи и при въпроси и отговори. - person Marijn; 27.01.2012
comment
А, благодаря! Що се отнася до автоматичното откриване, това не беше част от корекцията. Играех си с някои от атрибутите, но просто го оставих на автоматично откриване. - person Will Sams; 28.01.2012