ASP.NET - модульный тест MembershipProvider - PullRequest
6 голосов
/ 21 ноября 2010

Я пытаюсь провести модульное тестирование MembershipProvider, однако я не могу понять, как и есть ли необходимость в его модульном тестировании ...

Мой бизнес уровень:

public interface IAccountService
{
    MembershipCreateStatus CreateUser(string userName, string password, string email);
}

public class AccountService : IAccountService
{
    private readonly MembershipProvider provider;

    public AccountService() : this(null) { }
    public AccountService(MembershipProvider providera)
    {
        this.provider = providera ?? Membership.Provider;
    }

    public MembershipCreateStatus CreateUser(string userName, string password, string email)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", userName);
        if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", password);
        if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", email);

        MembershipCreateStatus status;
        provider.CreateUser(userName, password, email, null, null, true, null, out status);

        return status;
    }
}

Единственные примеры, которые я нашел до сих пор, требуют "MockMembershipProvider" с локальной настройкой базы данных ... мне это кажется довольно странным.

Заранее спасибо.

1 Ответ

6 голосов
/ 22 ноября 2010

Наличие «MockMembershipProvider с локальной настройкой базы данных» является странным по нескольким причинам.

Как правило, вы не хотите выполнять модульный тест кода доступа к данным.Ваши модульные тесты должны выполняться очень быстро и часто, и поэтому не требуют доступа к базе данных.Вот почему вы должны быть в состоянии смоделировать свой уровень доступа к данным.Сохраняющиеся данные будут приемлемы для интеграционного тестирования, но обычно не для модульного тестирования.

Остальная часть этого ответа основана на предположении, что вы не хотите попадать в БД в своем модульном тесте.


Если вы хотите провести модульное тестирование, членство в организации будет зависеть от того, что там происходит.

  1. Если поставщик членства написан на заказ и содержит бизнес-логику, то он должен быть проверен модулем.Если это так, вам нужно создать фиктивный объект DAO в провайдере членства, чтобы провайдер членства мог работать с модульными тестами, не обращаясь к базе данных.

  2. Если поставщик членства просто осуществляет доступ к базе данных (напрямую или с переадресацией вызовов на уровень доступа к данным), вам не следует выполнять его модульное тестирование.Если вы используете поставщика членства Microsoft asp.net, вам также не следует проверять его.

    Вместо этого вы должны создать макет MembershipProvider для использования в классе AccountService.Вы будете внедрять макет, используя инжектор конструктора, это цель следующего стандартного кода

    public AccountService() : this(null) { }
    public AccountService(MembershipProvider providera)
    {
        this.provider = providera ?? Membership.Provider;
    }
    

    Этот код облегчает инжектирование конструктором альтернативных реализаций (который включает в себя макеты).Пример того, как может выглядеть тест:

        [Test]
        public void ExampleTestWithAHandRolledMock()
        {
            //arrange
            var mockMembershipProvider = new MockMembershipProvider();//no db access in this mock implementation
            var accountService = new AccountService(mockMembershipProvider);
            //act
            accountService.CreateUser("foo", "bar", "baz");
            //assert
            Assert.IsTrue(mockMembershipProvider.MockUserExists("foo","bar","baz");//added a method to mock to confirm user was added
        }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...