Как смоделировать класс Membership в ASP.NET MVC, чтобы включить тестирование - PullRequest
4 голосов
/ 12 декабря 2010

Я создаю сайт ASP.NET MVC 3, который позволяет пользователям регистрироваться. Для этого я использую встроенный (статический) класс Membership; некоторые говорят, что это раздутый, но он работает хорошо и достаточно легко, так что вы есть.

В любом случае, я начал писать и класс AdminService, который будет обрабатывать функции, связанные с учетной записью пользователя, и давайте предположим, что у него есть только один метод:

public class AdminService : IAdminService
{
   public void DeleteUser(string username)
   {
      Membership.DeleteUser(username);
   }
}

Использование класса Membership, как это неправильно, двумя способами: его нельзя внедрить через IoC, и мне все труднее писать спецификации (тесты) для IAdminService, потому что я не могу высмеивать класс Membership.

Есть ли способ сделать класс членства ASP.NET удобным для тестирования и внедрения зависимостей без использования моего собственного?

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

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

Если вы создадите непустой проект ASP.NET MVC 3, в вашей папке Models будет файл AccountModels.cs.Он содержит пример того, как бороться с членством для включения модульного тестирования:

public interface IMembershipService
{
    int MinPasswordLength { get; }

    bool ValidateUser(string userName, string password);
    MembershipCreateStatus CreateUser(string userName, string password, string email);
    bool ChangePassword(string userName, string oldPassword, string newPassword);
}
0 голосов
/ 12 декабря 2010

Была такая же ситуация, когда я создавал сайт MVC, и в итоге развернул своего собственного (тестируемого) провайдера.

При этом, один из вариантов - просто поднять пример реализации с здесь - вы можете (теоретически) просто создать FakeProvider и жестко кодировать различные методы возврата по сравнению с нажатием на SQL база данных.

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

...